Оптимизация кода с использованием functools.lru_cache
В мире программирования производительность и эффективность кода имеют огромное значение. Одним из способов оптимизации вычислительных процессов является использование кэширования, и в Python для этого существует замечательный инструмент — functools.lru_cache.
functools.lru_cache — это декоратор, предоставляемый стандартной библиотекой Python, который позволяет автоматически кэшировать результаты выполнения функций. "LRU" в названии означает "Least Recently Used" (наименее недавно использованный). Этот тип кэширования работает по принципу: если кэш заполнен, то удаляется элемент, который использовался очень давно (раньше всех остальных).
Преимущества использования lru_cache
- Ускорение выполнения: За счёт кэширования повторные вызовы функции с одинаковыми аргументами выполняются быстрее, так как результат берётся из кэша, а не вычисляется заново
- Уменьшение нагрузки на ресурсы: Особенно полезно для функций, которые выполняют тяжёлые вычисления или делают частые запросы к базе данных / сети Интернет
- Простота использования: lru_cache легко интегрируется в существующий код с минимальными изменениями
Пример использования
Рассмотрим простой пример использования lru_cache на функции вычисления чисел Фибоначчи:
from functools import lru_cache
@lru_cache(maxsize=128)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(100))
В этом примере декоратор @lru_cache(maxsize=128) кэширует результаты выполнения функции fibonacci. Аргумент maxsize определяет максимальное количество записей в кэше.
Параметры lru_cache
lru_cache поддерживает несколько параметров для настройки:
- maxsize: Определяет максимальное количество записей в кэше. Если maxsize равен None, кэш может расти бесконечно
- typed: Если установлено в True, кэш будет учитывать типы аргументов функции. Например, f(3) и f(3.0) будут храниться как разные записи
Влияние на производительность
Использование lru_cache может значительно повысить производительность вашего кода. Однако, важно помнить, что кэширование потребляет дополнительную память, а также добавляет накладные расходы по проверке присутствия в кэше В случае ограниченных ресурсов, нужно внимательно подбирать значение maxsize.
Для мониторинга эффективности кэширования, можно использовать атрибуты декоратора:
print(factorial.cache_info())
Этот метод вернёт информацию о количестве попаданий в кэш, промахов, текущем размере и максимальном размере кэша.
functools.cache
functools.cache - это альтернативная реализация функции lru_cache со значением maxsize=None. Кроме того, эта функция оптимизирована под бесконечный кэш. Она не выполняет проверку размера кэша, и никогда не удаляет из него элементы, что немного снижает накладные расходы.