На этом шаге мы рассмотрим использование декоратора для автоматической мемоизации.
Функцию fib3() можно сделать еще проще. В Python есть встроенный декоратор для автоматической мемоизации любой функции. В fib4() декоратор @functools.lru_cache() использован точно с тем же кодом, который мы применили в fib2(). Каждый раз, когда fib4() выполняется для нового аргумента, декоратор выполняет кэширование возвращаемого значения. При последующих вызовах fib4() для того же аргумента сохраненное значение извлекается из кэша и возвращается.
from functools import lru_cache @lru_cache(maxsize=None) def fib4(n: int) -> int: # такое же определение, как в fib() if n < 2: # базовый случай return n return fib4(n - 2) + fib4(n - 1) # рекурсивный случай if __name__ == "__main__": print(fib4(5)) print(fib4(50))
Обратите внимание: мы можем мгновенно вычислить fib4(50), несмотря на то что тело функции Фибоначчи такое же, как и в fib2(). Свойство @lru_cache maxsize определяет, сколько последних вызовов функции, которые оно декорирует, должно быть закэшировано. Значение None означает отсутствие ограничений.
На следующем шаге мы рассмотрим еще один способ вычисления требуемого числа Фибоначчи.