这些(几乎相同)条件之间的效率差异是什么

时间:2013-09-08 21:01:29

标签: python

我被朋友挑战在python中构建一个高效的Fibonacci函数。所以我开始测试不同的递归方式(我没有很高的数学技能来考虑复杂的算法,请不要向我展示一个有效的Fibonacci函数,这不是问题)

然后我尝试了两种不同的解决方案:

解决方案1:

def fibo(n):
    if n > 1:
        return fibo(n-1)+fibo(n-2)
    return 1

解决方案2:

def fibo(n):
    if n < 1:
        return 1
    return fibo(n-1)+fibo(n-2)

然后,我为每个人运行了这个:

res = map(fibo, range(35))
print res

现在,我怀疑可能存在效率差异(我不能确切地说为什么)。但我预计会有一点不同。结果彻底击败了我。差异是巨大。第一个花了7.5秒,而第二个花费了惊人的12.7(几乎是两次!)。

任何人都可以向我解释原因吗?那些基本上不一样吗?

2 个答案:

答案 0 :(得分:13)

(not n > 1)(n <= 1),使用<=重新运行第二个代码,您会看到类似的时间:

In [1]: def fibo(n):
   ....:    if n <= 1:
   ....:        return 1
   ....:    return fibo(n-1)+fibo(n-2)
   ....: 

In [2]: %timeit map(fibo, range(10))
10000 loops, best of 3: 29.2 us per loop

In [3]: def fibo(n):
   ....:    if n > 1:
   ....:        return fibo(n-1)+fibo(n-2)
   ....:    return 1
   ....: 

In [4]: %timeit map(fibo, range(10))
10000 loops, best of 3: 29.9 us per loop

如果您想知道为什么这会产生如此巨大的差异,当您运行map(fibo, range(35))时,您14930351会有fibo(1)次来电。使用(n < 1),每个fibo(1)将进行两次函数调用(fibo(0)fibo(-1))并对结果进行求和,进行相当多的操作!

答案 1 :(得分:8)

  

这些基本上不一样吗?

第二个功能是计算更高的斐波那契数,所以自然需要更长的时间:

>>> def fibo(n):
...     if n > 1:
...         return fibo(n-1)+fibo(n-2)
...     return 1
... 
>>> fibo(10)
89
>>> def fibo(n):
...     if n < 1:
...         return 1
...     return fibo(n-1)+fibo(n-2)
... 
>>> fibo(10)
144

您可能希望在第二个代码段中使用n <= 1

>>> def fibo(n):
...     if n <= 1:
...         return 1
...     return fibo(n-1)+fibo(n-2)
... 
>>> fibo(10)
89