Mediumcachefunctools

Что такое @functools.lru_cache?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

@functools.lru_cache — декоратор, кэширующий результаты функции по аргументам (memoization). LRU = Least Recently Used.

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    return n if n < 2 else fib(n - 1) + fib(n - 2)

fib(100)      # вычисляет один раз
fib(100)      # мгновенно из cache

fib.cache_info()
# CacheInfo(hits=1, misses=101, maxsize=None, currsize=101)
fib.cache_clear()
  • Аргументы должны быть hashable (immutable);
  • typed=True3 и 3.0 считаются разными ключами;
  • @cache (Python 3.9) — alias для lru_cache(maxsize=None);
  • @cached_property — property с cache;
  • На method с self — cache держится до удаления объекта (может течь память при многих instances);
  • Эффективно для чистых (pure) функций, рекурсии, дорогих вычислений.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.