Почему декоратор functools.cache не работает с моей функцией последовательности Фибоначчи с запоминанием?Python

Программы на Python
Anonymous
Почему декоратор functools.cache не работает с моей функцией последовательности Фибоначчи с запоминанием?

Сообщение Anonymous »

Я возился с мемоизацией в Python и использовал в качестве модели пример функции последовательности Фибоначчи. Я написал первую функцию fibonacci() как обычную функцию без мемоизации, и она работает как положено. Затем я написал свою функцию fibonacci_memo(), которая использовала мемоизацию с использованием словаря входных и выходных данных, и она работала, как и ожидалось. Затем я захотел протестировать декоратор кэша functools, чтобы увидеть, достиг ли он того же эффекта, которого я ожидал. Итак, я скопировал исходную функцию fibonacci(), которая не использовала мемоизацию, и добавил к ней декоратор @cache. Результат был неожиданным, однако, похоже, он работает так же, как и исходная функция fibonacci(), которая не использовала мемоизацию.
Могу ли я неправильно понять полезность декоратора? или мемоизация вообще? Код приведен ниже, любая помощь приветствуется!
from functools import cache

def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci(23))
# instant, works as expected

def fibonacci_memo(n, memo:dict={}):
if n == 0:
return 0
elif n == 1:
return 1
if n in memo:
return memo[n]
memo[n] = fibonacci_memo(n - 1, memo) + fibonacci_memo(n - 2, memo)
return fibonacci_memo(n - 1, memo) + fibonacci_memo(n - 2, memo)

print(fibonacci_memo(500))
# instant, works as expected

@cache
def fibonacci_functools(n): # identical to first, basic fibonacci function
if n == 0:
return 0
elif n == 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)

print(fibonacci_functools(500))
# slow, shouldn't it be te same as fibonacci_memo()??


Подробнее здесь: https://stackoverflow.com/questions/788 ... e-function

Вернуться в «Python»