我在 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()??
谢谢你,卡姆拉纳。这只是一个错字。我必须在其自己的函数中使用 @cache 装饰器调用该函数才能使其工作。在我调用旧的基本
fibonacci()
函数之前,无需记忆,因为我只是复制并粘贴它。
“您的 fibonacci_functools() 函数需要调用自身以允许 @cache 完成其工作。” -卡姆拉纳