Вопрос проверяет понимание декораторов, словарей и концепции мемоизации.
Кэширование можно реализовать с помощью декоратора, который сохраняет результаты функции в словаре. При повторном вызове с теми же аргументами возвращается сохранённый результат. Это ускоряет функции, которые часто вызываются с одинаковыми параметрами. В Python также есть готовое решение functools.lru_cache.
Кэширование (мемоизация) — это техника, при которой результат функции сохраняется и повторно используется.
Идея:
Создать словарь для хранения результатов.
Проверять, есть ли результат в словаре.
Если есть — вернуть его.
Если нет — вычислить и сохранить.
Пример:
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
Использование:
@cache_decorator
def slow_function(x):
# имитация тяжёлого вычисления
return x * x
Python предоставляет:
from functools import lru_cache
@lru_cache(maxsize=128)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
Кэширование эффективно:
при дорогих вычислениях
при повторяющихся аргументах
при детерминированных функциях
Не подходит:
если результат зависит от внешнего состояния
если аргументы часто уникальны
Кэширование через декораторы — простой способ ускорить вычисления. В большинстве случаев лучше использовать functools.lru_cache, так как он реализован эффективно и поддерживает управление размером кэша.