python记忆能提高递归函数的性能吗?

时间:2016-08-05 06:58:59

标签: python performance recursion memoization

例如,如果我有以下递归函数

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

如何使用python记忆来提高性能?

1 个答案:

答案 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]