Сохраняйте результат в словаре по аргументам и возвращайте его при повторном ключе. Аргументы должны быть хешируемыми, а результат — пригодным для повторного использования без нежелательных побочных эффектов.
Запоминание результатов функции
Сохраняйте результат в словаре по аргументам и возвращайте его при повторном ключе. Аргументы должны быть хешируемыми, а результат — пригодным для повторного использования без нежелательных побочных эффектов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте декоратор, который будет сохранять результаты выполнения функции. При повторном вызове с теми же аргументами необходимо вернуть уже вычисленное значение из кеша (например, используя словарь). Если результат для данных параметров ещё не сохранён, вычислите его, запишите в кеш и верните.
Ответ
Сохраняйте результат в словаре по аргументам и возвращайте его при повторном ключе. Аргументы должны быть хешируемыми, а результат — пригодным для повторного использования без нежелательных побочных эффектов.
Базовый вариант:
from functools import wraps
def memoize(func):
cache = {}
@wraps(func)
def wrapper(*args, **kwargs):
key = (args, tuple(kwargs.items()))
if key not in cache:
cache[key] = func(*args, **kwargs)
return cache[key]
return wrapper
Порядок kwargs входит в ключ, поэтому семантически равные вызовы могут иметь разные записи. Кеш не ограничен по размеру; для сервиса нужны eviction/TTL. Исключения не сохраняются, а изменяемый результат выдаётся по общей ссылке. Отдельно решаются конкурентные вычисления одного ключа.