我正在练习python中的Fibonacci序列生成,并遵循How do I print a fibonacci sequence to the nth number in Python?的memoization示例。
然后我遇到了一个有趣的区别,使用返回单线而不是。例如,下面给出了示例代码。在第一个例子中,我们不使用返回单行程并且它运行得非常快,但是,在第二个示例中,我们使用返回单行程并且它运行得非常慢。
他们不应该是一样的吗?
def memoize(func):
memo = dict()
def decorated(n):
if n not in memo:
memo[n] = func(n)
return memo[n]
return decorated
@memoize
def fib(n):
if n<=1:
return 1
else:
return fib(n-1) + fib(n-2)
print([ fib(i) for i in range(100,110)]) # runs very fast
def memoize(func):
memo = dict()
def decorated(n):
return func(n) if n not in memo else memo[n]
return decorated
@memoize
def fib(n):
if n<=1:
return 1
else:
return fib(n-1) + fib(n-2)
print([ fib(i) for i in range(100,110)]) # very slow
题 他们不应该是一样的吗? 为什么返回单行程比另一行慢得多? 我们可以用不同的措辞写一行代码,以便同样快速吗?
这个
if n not in memo:
memo[n] = func(n)
return memo[n]
是不一样的
return func(n) if n not in memo else memo[n]
单行内容不会修改备忘录的内容。如果你想比较苹果和苹果,那么试试:
if n not in memo:
return func(n)
return memo[n]
要优化您的一个班轮,并保存字典值,您应该将单行更改为:
return memo[n] if n in memo else memo.setdefault(n, func(n))
除了学习memoize如何工作之外,你应该考虑使用functools lru_cache's memoize,它是“用C语言编写的,并且比你在Python中可以重现的任何东西都要快得多”。
帽子提示meowgoesthedog,chepner和FHTMitchell。