Короткий ответ
lru_cache сохраняет результаты вызовов функции по ключу из её аргументов с ограничением по размеру (LRU-вытеснение); аргументы должны быть хешируемыми, а кэш хранит ссылки на результаты и по умолчанию общий для всех вызовов независимо от потока.
Как это работает подробнее
При вызове декорированной функции lru_cache формирует ключ из переданных аргументов, ищет в кэше готовый результат; при отсутствии — вычисляет, сохраняет и при превышении maxsize вытесняет наименее давно использованный элемент.
Пример кода
example-266.py
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n: int) -> int:
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
print(fib(30)) # быстро благодаря кэшированию промежуточных результатов
print(fib.cache_info()) # hits/misses/maxsize/currsize - проверка эффективности кэша
fib.cache_clear() # явная очистка, полезно в тестахЧто использовать на практике
- Практика. Полезен для чистых функций с повторяющимися одинаковыми аргументами;
maxsize=Noneубирает лимит размера, что может привести к неограниченному росту памяти на долгоживущем процессе при множестве уникальных входов.
Подводные камни
- Риски. Передают мутабельные аргументы (списки, словари) —
TypeErrorиз-за unhashable type; применяютlru_cacheк методам экземпляра, не учитывая, чтоselfтоже часть ключа кэша, из-за чего экземпляры не удаляются сборщиком мусора, пока существует запись в кэше.