Здравствуйте! Я хотел бы поделиться с вами, как я написал декоратор для кэширования вызовов функций. Этот декоратор будет проверять наличие значения в кэше и возвращать его, если оно уже было вычислено, или вычислять и запоминать результат, если значения нет в кэше.
Вот как выглядит код декоратора⁚
def cache_deco(func)⁚
cache {}
def wrapper(*args, **kwargs)⁚
key (args, frozenset(kwargs.items))
if key not in cache⁚
cache[key] func(*args, **kwargs)
return cache[key]
return wrapper
Теперь, чтобы использовать этот декоратор, вам нужно применить его к вашей функции. Вот пример использования⁚
@cache_deco
def fib(k)⁚
if k nlt; 2⁚
return 1
return fib(k ─ 1) fib(k ー 2)
print(fib(30))
Суть декоратора заключается в следующем⁚
- Он создает словарь с именем `cache`, который будет служить для хранения кэшированных значений. Ключами словаря будут кортежи, состоящие из аргументов и ключей-значений функции.
- Декоратор определяет внутреннюю функцию `wrapper`, которая будет обертывать исходную функцию.
- Внутри `wrapper` декоратор проверяет, есть ли ключ в словаре `cache`. Если ключа нет, то вызывается исходная функция и ее результат записывается в кэш с использованием ключа. Если ключ есть, то результат берется из кэша.
- Возвращается функция `wrapper` в качестве ″укрытия″ для исходной функции.
Теперь, когда вы запустите код, вы увидите, что первый запуск функции занимает какое-то время, но если вы вызовете ее с теми же аргументами во второй раз, результат будет возвращаться мгновенно, так как он будет браться из кэша.
Надеюсь, мой опыт с написанием данного декоратора окажется полезным для вас!