Mediumcache

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

1Постановка

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

2Решение

@cached_property (functools, Python 3.8) — property, вычисляемое один раз и кэшируемое в instance.__dict__. @functools.lru_cache — memoization для чистых функций по args.

from functools import cached_property, lru_cache

class DataSet:
    def __init__(self, n):
        self.n = n

    @cached_property
    def squares(self):
        print('computing')   # один раз
        return [i**2 for i in range(self.n)]

d = DataSet(1000)
d.squares   # computing once
d.squares   # cached (из instance.__dict__)

@lru_cache(maxsize=None)
def fib(n):
    return n if n < 2 else fib(n - 1) + fib(n - 2)
  • cached_property не работает с __slots__ (нет __dict__);
  • lru_cache на method держит cache до удаления instance (memory leak);
  • cache_info(), cache_clear(); typed=True — разные кэши для 1 и 1.0;
  • Аргументы hashable (immutable); @cache (3.9) — alias для lru_cache(None).

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

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

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