Python·100 вопросов

Как кэшировать вычисления (functools.lru_cache)?

Ответ

Кэширование результатов вычислений является эффективным способом оптимизации производительности программ на языке Python, особенно когда речь идет о ресурсоемких функциях. Стандартная библиотека предоставляет для этого удобный инструмент в виде декоратора lru_cache из модуля functools, который реализует стратегию кэширования least recently used, автоматически удаляя наименее используемые элементы при достижении лимита.

Данный декоратор лучше всего применять для так называемых чистых функций, то есть таких функций, результат которых зависит исключительно от переданных аргументов и которые не производят побочных эффектов. Важным техническим требованием для успешного кэширования является то, что все аргументы функции должны быть хешируемыми, например, числа, строки или кортежи, так как они используются в качестве ключей словаря кэша.

Вы можете гибко управлять работой кэша с помощью параметров декоратора, таких как maxsize, который определяет максимальное количество сохраняемых в памяти результатов. Кроме того, для программного управления состоянием кэша предусмотрены специальные методы, например, cache_clear, который полностью очищает накопленный кэш, или методы для получения статистики попаданий и промахов.

Однако при разработке масштабных распределенных систем или приложений с большими объемами данных стандартного декоратора lru_cache может оказаться недостаточно. В таких сложных кейсах рекомендуется использовать внешние решения для кэширования, такие как Redis или Memcached, которые поддерживают инвалидацию по времени и совместное использование кэша между несколькими инстансами приложения.

Импортируйте декоратор lru_cache из модуля functools.
Убедитесь, что ваша функция является чистой и принимает только хешируемые аргументы.
Добавьте декоратор над определением функции, указав при необходимости параметр maxsize.
Вызывайте функцию обычным образом, позволяя Python автоматически сохранять и возвращать результаты.
Используйте метод cache_clear для очистки кэша при изменении внешних данных или состояния программы.
Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем