Мемоизация — это техника оптимизации, которая позволяет сохранять результаты функций с целью избежать повторных вычислений. В Python, для реализации мемоизации, часто используется декоратор functools.lru_cache
. В этой статье мы рассмотрим, как применять мемоизацию в Python с помощью данного декоратора.
functools.lru_cache
functools.lru_cache
— это декоратор, который позволяет кэшировать результаты вызова функции с определенными аргументами. Если функция вызывается с уже сохраненными аргументами, результат будет взят из кэша, что может существенно ускорить выполнение кода. Рассмотрим пример использования lru_cache
:
import functools @functools.lru_cache() def fib(n): if n < 2: return n else: return fib(n-1) + fib(n-2) print(fib(100))
В данном примере мы применили декоратор lru_cache
к функции fib
, вычисляющей числа Фибоначчи. Без мемоизации вычисление больших чисел Фибоначчи может занимать долгое время, но с использованием кэша функция работает значительно быстрее.
Ограничение размера кэша
По умолчанию functools.lru_cache
использует кэш с максимальным размером 128 элементов. Если кэш превышает этот размер, наименее использованные элементы будут удалены. Вы можете изменить размер кэша, передав параметр maxsize
:
@functools.lru_cache(maxsize=256) def fib(n): # ...
Очистка кэша
В некоторых случаях может потребоваться очистить кэш, например, при изменении внешних данных, влияющих на результат функции. Для этого используйте метод cache_clear()
:
fib.cache_clear()
Вывод
Мемоизация — полезная техника оптимизации, которая может существенно ускорить выполнение вашего кода. В Python, для применения мемоизации, используйте декоратор functools.lru_cache
. Он позволяет кэшировать результаты функций с заданными аргументами и управлять размером кэша.
Не забывайте, что мемоизация подходит только для функций без побочных эффектов и с детерминированными результатами. Если результат функции зависит от внешних факторов или вызывает побочные эффекты, мемоизация может привести к непредсказуемому поведению.
Удачи в изучении Python и применении мемоизации! 😊
Добавить комментарий