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 подскажет развёрнутый ответ в реальном времени.