Что такое кешируемый метод (cached method) в программировании?

«Что такое кешируемый метод (cached method) в программировании?» — вопрос из категории HTTP и веб-протоколы, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кешируемый метод (или мемоизированная функция) — это метод, результат выполнения которого сохраняется (кешируется) после первого вызова. При последующих вызовах с теми же аргументами результат возвращается из кеша, минуя повторные вычисления. Это классическая оптимизация «разменять память на время».

Зачем это нужно?

  • Ускорение работы: Избегание дорогостоящих вычислений (рекурсия, сложные расчёты, запросы к БД/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} сек")

Ключевые аспекты и ограничения:

  1. Чистота функции: Метод должен быть детерминированным и не иметь побочных эффектов (side effects). Его результат должен зависеть только от входных аргументов.
  2. Потребление памяти: Кеш занимает память. Важно ограничивать его размер (параметр maxsize в lru_cache).
  3. Неприменимость: Нельзя кешировать методы, зависящие от глобального состояния, случайных значений или текущего времени.
  4. Инвалидация кеша: При изменении данных, на которых основаны вычисления, кеш необходимо сбрасывать.