为什么 functools.cache 装饰器不能在我的具有记忆功能的斐波那契序列函数上工作?

问题描述 投票:0回答:1

我在 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()??
python caching fibonacci memoization functools
1个回答
0
投票

谢谢你,卡姆拉纳。这只是一个错字。我必须在其自己的函数中使用 @cache 装饰器调用该函数才能使其工作。在我调用旧的基本

fibonacci()
函数之前,无需记忆,因为我只是复制并粘贴它。

“您的 fibonacci_functools() 函数需要调用自身以允许 @cache 完成其工作。” -卡姆拉纳

© www.soinside.com 2019 - 2024. All rights reserved.