Ответ
Кешируемый метод (или мемоизированная функция) — это метод, результат выполнения которого сохраняется (кешируется) после первого вызова. При последующих вызовах с теми же аргументами результат возвращается из кеша, минуя повторные вычисления. Это классическая оптимизация «разменять память на время».
Зачем это нужно?
- Ускорение работы: Избегание дорогостоящих вычислений (рекурсия, сложные расчёты, запросы к БД/API).
- Гарантия детерминированности: Для чистых функций (без side effects) с одинаковыми входными данными.
Пример реализации на Python с @lru_cache:
from functools import lru_cache
import time
# Без кеширования - очень медленно для больших n
# def fib(n):
# if n < 2:
# return n
# return fib(n-1) + fib(n-2)
@lru_cache(maxsize=None) # Декоратор кеширует все вызовы
def fib_cached(n):
if n < 2:
return n
return fib_cached(n-1) + fib_cached(n-2)
# Первый вызов с n=35 выполнит вычисления
start = time.time()
print(fib_cached(35))
print(f"Первый вызов: {time.time() - start:.4f} сек")
# Повторный вызов с тем же n=35 — результат мгновенно из кеша
start = time.time()
print(fib_cached(35))
print(f"Повторный вызов: {time.time() - start:.4f} сек")
Ключевые аспекты и ограничения:
- Чистота функции: Метод должен быть детерминированным и не иметь побочных эффектов (side effects). Его результат должен зависеть только от входных аргументов.
- Потребление памяти: Кеш занимает память. Важно ограничивать его размер (параметр
maxsizeвlru_cache). - Неприменимость: Нельзя кешировать методы, зависящие от глобального состояния, случайных значений или текущего времени.
- Инвалидация кеша: При изменении данных, на которых основаны вычисления, кеш необходимо сбрасывать.