带有记忆的斐波纳契数字在Python中运行缓慢?

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


def memo(f):
    cache = {}
    def memoized(n):
        if n not in cache:
            cache[n] = f(n)
        return cache[n]
    return memoized

fib1 = memo(fib)

此代码在我的笔记本电脑上运行速度非常慢,但如果我将名称更改为fib,那么一切正常......任何人都知道原因? 谢谢!


fib递归到fib ,而不是fib1 。 如果备忘录版本具有不同的名称,则不会被使用。


在该代码中, fib是非memoized函数的名称。 fib1是您为memoized函数提供的名称。 但是,如果你看到你的代码,你会发现它递归调用fib非非memoized版本。 因此,为什么你没有获得速度优势。


我同意添加一些打印您可能会看到问题。 你真的很接近实际得到它。

你现在所拥有的只存储了n,其中n是给予fib1的参数。 在fib中,你调用了不会记忆任何以前计算值的fib。 因此,通过向fib print "fib ", n添加一个print语句并调用fib1(4),您将得到以下输出:

fib 4
fib 2
fib 3
fib 1
fib 2

所以你会看到它调用两次n = 2的fib。 fib = memo(fib)更快的原因是因为它实际上是momoizing,因为你将fib重新定义为memoized函数。

链接地址: http://www.djcxy.com/p/51115.html

上一篇: Fibonacci numbers with memoization runs slow in Python?

下一篇: python: how binding works