例如,如果我有以下递归函数
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
如何使用python记忆来提高性能?
答案 0 :(得分:1)
记忆不会提高递归函数的性能,除非您要多次使用该函数 - 然后会立即返回先前计算的结果。这将使性能优于线性
自己尝试一下
import timeit
setup ='''
def fib3(n): #FASTEST YET
fibs= [0,1] #list from bottom up
for i in range(2, n+1):
fibs.append(fibs[-1]+fibs[-2])
return fibs[n]
def fib4(n, computed= {0:0, 1:1}): #memoization
if n not in computed:
computed[n]= fib4(n-1, computed)+ fib4(n-2, computed)
return computed[n]
'''
print (min(timeit.Timer('fib3(600)', setup=setup).repeat(3, 1)))
print (min(timeit.Timer('fib4(600)', setup=setup).repeat(3, 1)))
This will show fib4 taking longer.
单次运行,递归的结果很昂贵。
0.00010111480978441638
0.00039419570581368307
[Finished in 0.1s]
如果更改最后两行,即每次重复100次,结果会发生变化现在,fib4变得更快,好像不仅没有递归,几乎没有额外的时间来计算
print (min(timeit.Timer('fib3(600)', setup=setup).repeat(3, 100)))
print (min(timeit.Timer('fib4(600)', setup=setup).repeat(3, 100)))
50次重复的结果,线性函数现在线性增长,但记忆几乎不需要额外的时间!
0.00501430622506104
0.00045805769094068097
[Finished in 0.1s]
100次重复的结果,线性函数需要两倍以上的时间,但记忆几乎不需要额外的时间
0.01583016969421893
0.0006815746388851851
[Finished in 0.2s]