Ответ
Кэширование — это техника сохранения результатов ресурсоёмких операций, чтобы при повторном запросе с теми же входными данными вернуть их мгновенно, без повторного вычисления.
Принцип работы:
- При первом вызове функции или запросе система выполняет операцию (например, сложный расчёт или запрос к базе данных).
- Результат сохраняется в быстром хранилище (кэше), например, в оперативной памяти, с привязкой к ключу (часто это аргументы функции).
- При последующих вызовах с тем же ключом система проверяет наличие результата в кэше. Если он найден, он возвращается немедленно, минуя основную операцию.
Это значительно снижает нагрузку на CPU, дисковую подсистему или сеть и уменьшает время отклика.
Пример: Мемоизация с lru_cache в Python
Декоратор functools.lru_cache реализует кэширование по принципу "Least Recently Used" (вытеснение наименее используемых).
from functools import lru_cache
import time
# maxsize — максимальное количество результатов для хранения
@lru_cache(maxsize=128)
def fibonacci(n):
# Имитация долгой операции
# time.sleep(0.1)
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
# Первый вызов: выполняются все рекурсивные вычисления, результаты кэшируются
start_time = time.time()
result1 = fibonacci(35)
print(f"Первый вызов: {time.time() - start_time:.4f} секунд")
# Второй вызов: результат мгновенно возвращается из кэша
start_time = time.time()
result2 = fibonacci(35)
print(f"Второй вызов (из кэша): {time.time() - start_time:.8f} секунд")
Ключевые сценарии применения:
- Чистые функции: Функции, которые для одних и тех же входных данных всегда возвращают один и тот же результат.
- Запросы к базам данных: Кэширование часто запрашиваемых данных (например, профиль пользователя).
- API-запросы: Сохранение ответов от внешних сервисов.
Основной компромисс при использовании кэша — это увеличение потребления памяти в обмен на скорость.