Оптимизация кода с использованием functools.lru_cache

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

functools.lru_cache — это декоратор, предоставляемый стандартной библиотекой Python, который позволяет автоматически кэшировать результаты выполнения функций. "LRU" в названии означает "Least Recently Used" (наименее недавно использованный). Этот тип кэширования работает по принципу: если кэш заполнен, то удаляется элемент, который использовался очень давно (раньше всех остальных).

Преимущества использования lru_cache

  1. Ускорение выполнения: За счёт кэширования повторные вызовы функции с одинаковыми аргументами выполняются быстрее, так как результат берётся из кэша, а не вычисляется заново
  2. Уменьшение нагрузки на ресурсы: Особенно полезно для функций, которые выполняют тяжёлые вычисления или делают частые запросы к базе данных / сети Интернет
  3. Простота использования: 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. Кроме того, эта функция оптимизирована под бесконечный кэш. Она не выполняет проверку размера кэша, и никогда не удаляет из него элементы, что немного снижает накладные расходы.