我正在练习用Python生成斐波那契序列,并遵循How do I print a fibonacci sequence to the nth number in Python?中的记忆示例。
然后我遇到了一个有趣的区别,那就是使用返回单线而不是返回。例如,下面给出示例代码。在第一个示例中,我们不使用return one-liner并且运行非常快,但是,在第二个示例中,我们使用return one-liner并且运行非常慢。
他们应该不一样吗?
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
问题
他们应该不一样吗?
为什么返回一线比另一个线慢得多?
我们可以用不同的措词写一个班轮,以便它同样快吗?
答案 0 :(得分:5)
此
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))
除了学习备忘录的工作原理之外,您还应该使用functools lru_cache's备忘录,它是“用C编写的,并且比用Python可以复制的东西要快得多。”
喵喵狗,chepner和FHTMitchell的帽子提示。