Короткий ответ
lru_cache запоминает результаты вызовов функции по её аргументам и возвращает сохранённый результат при повторном вызове с теми же аргументами, но подходит только для чистых функций с хешируемыми аргументами и ограниченным набором входных значений.
Как это работает подробнее
Декоратор хранит словарь «аргументы → результат» и вытесняет записи по принципу LRU после достижения maxsize; повторный вызов с уже виденными аргументами возвращает значение из кэша без выполнения тела функции.
Пример кода
example.py
from functools import lru_cache
@lru_cache(maxsize=256)
def parse_config_section(section_name: str) -> dict:
# дорогая, но детерминированная операция
return {"section": section_name, "parsed": True}
parse_config_section("db") # выполнится и закэшируется
parse_config_section("db") # вернётся мгновенно из кэша
# parse_config_section({"a": 1}) # TypeError: unhashable type: dictЧто использовать на практике
- Практика. Полезен для дорогих детерминированных вычислений (например, парсинг конфигурации, построение неизменяемых структур) с небольшим количеством уникальных комбинаций аргументов; maxsize нужно подбирать осознанно, а не оставлять unbounded.
Подводные камни
- Риск. Применяют lru_cache к функциям с побочными эффектами или недетерминированным результатом (текущее время, случайные числа, сетевые вызовы с изменяющимися данными); забывают, что аргументы должны быть хешируемыми (list или dict как аргумент вызовет ошибку); кэш на уровне модуля в веб-приложении может расти неограниченно и утекать память при maxsize=None.