Сохраняйте результаты по хешируемому ключу аргументов и возвращайте их при повторе. Кеш должен иметь понятные ограничения размера и правила актуальности.
Декоратор‑мемоизация для функций
Сохраняйте результаты по хешируемому ключу аргументов и возвращайте их при повторе. Кеш должен иметь понятные ограничения размера и правила актуальности.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо реализовать декоратор на Python, который будет сохранять результат работы функции в кэше. При повторных вызовах функции с теми же параметрами следует возвращать значение из кэша, а не выполнять функцию заново.
def memoize(target):
# TODO: реализация кеширующего декоратора
pass
Ответ
Сохраняйте результаты по хешируемому ключу аргументов и возвращайте их при повторе. Кеш должен иметь понятные ограничения размера и правила актуальности.
from functools import wraps
def memoize(target):
cache = {}
@wraps(target)
def wrapper(*args, **kwargs):
key = (args, tuple(sorted(kwargs.items())))
if key not in cache:
cache[key] = target(*args, **kwargs)
return cache[key]
wrapper.cache_clear = cache.clear
return wrapper
Это учебный вариант для хешируемых аргументов и функций без существенных побочных эффектов. Эквивалентные вызовы с позиционными и именованными аргументами могут образовать разные ключи. Изменяемый результат возвращается тем же объектом, поэтому его правки повлияют на кеш. В реальной задаче задайте размер/TTL; стандартный lru_cache уже реализует ограничение размера. Конкурентные первые вызовы требуют отдельной политики.