


functools.lru_cache сохраняет результаты вызовов функции и возвращает их повторно для уже встречавшихся аргументов. Он подходит для вычисления, результат которого можно безопасно переиспользовать. Перед добавлением декоратора проверьте две вещи: от чего зависит результат и когда он должен устаревать.
Разберём на Mentoring.digital учебный расчёт стоимости набора по неизменяемому списку цен. Это пример работы кеша, а не измерение ускорения реального приложения.
from functools import lru_cache
@lru_cache(maxsize=128)
def total(prices):
return sum(prices)
print(total((120, 80)))
print(total((120, 80)))
print(total.cache_info())
Оба вызова возвращают 200. После первого вычисления второй вызов использует сохранённое значение. В свежем процессе cache_info() покажет одно попадание, один промах и одну запись: hits=1, misses=1, maxsize=128, currsize=1.
Для такого короткого суммирования кеш может не окупить свои расходы. Пример показывает механику. В проекте сначала измерьте повторяемость аргументов и время функции, затем сравните одинаковые сценарии с кешем и без него.
Аргументы должны быть хешируемыми. Кортеж чисел подходит, список чисел вызовет TypeError. Кортеж, содержащий список, тоже не решает проблему. Если порядок данных не важен, нормализацию следует определить отдельно, до вызова кешируемой функции, а не надеяться на автоматическое распознавание одинакового смысла.
Разные формы вызова могут занимать разные записи. Например, перестановка именованных аргументов не обязана попадать в тот же ключ. Параметр typed=True разделяет непосредственные аргументы разных типов; он не выполняет глубокое сравнение типов внутри вложенных коллекций.
maxsize ограничивает число записей. Когда места не хватает, вытесняются давно не использовавшиеся результаты. Значение None отключает ограничение размера. Это требует внимания к памяти: кеш удерживает ссылки на аргументы и результаты.
total.cache_clear()
print(total.cache_info())
# hits=0, misses=0, currsize=0
Очистка нужна, если меняется внешняя информация, от которой зависит расчёт. Сам декоратор не задаёт срок жизни в секундах. Если цены читаются из изменяемого справочника, одинаковый идентификатор товара ещё не означает одинаковый ответ. Один из вариантов проектирования: передавать версию справочника в аргументы либо явно инвалидировать кеш при обновлении.
Проверьте одинаковые и разные аргументы, очистку и изменение исходных данных. Если результат должен быть новым при каждом вызове, начните с пересмотра самой идеи кеширования.
Работу функций и коллекций можно изучить на курсах Python. Для выбора границ кеша в существующем приложении подойдёт разбор с наставником по Python.