比较斐波那契算法的速度

时间:2018-06-10 12:39:05

标签: python algorithm fibonacci

我尝试了两种Fibonacci系列算法并比较速度。

第一个是通过Numpy的矩阵的力量(我也写了我自己的函数,但似乎numpy更快)。

ListView

第二种是具有缩短内存的动态编程。

import numpy as np
import time

def fibonacci_power(n):
    F=np.matrix('1,1;1,0')
    Fn=F**(n-1)
    return Fn[0,0]

第一个的时间复杂度是 O(log n),第二个是 O(n)。因此对于较大的 n ,第一个应该更快。

我在下面比较他们的速度:

def fibonacci_mem(n):
    f=[0, 1]
    if n<=1:
        return f[n]
    for i in range(2, n+1):
        temp=f[1]
        f[1]=f[1]+f[0]
        f[0]=temp
    return f[1]

结果是:

def main():
    n=90

    start=time.time()
    f1=fibonacci_power(n)
    f1_time=time.time()-start
    print('Power/Numpy result: '+str(f1)+' time: '+str(f1_time))

    start=time.time()
    f3=fibonacci_mem(n)
    f3_time=time.time()-start
    print('Memory result: '+str(f3)+' time: '+str(f3_time))

我是否以正确的方式比较他们的速度?如果是,有人可以解释为什么第二个更快?感谢。

1 个答案:

答案 0 :(得分:0)

使用cProfile,它会显示你的功能正在做的一切(呼叫等)。并且,比较一下:

import cProfile
cProfile.run('fibonacci_power(150)')
#compare it to
cProfile.run('fibonacci_mem(150)')

对此:

import cProfile
cProfile.run('fibonacci_power(15000)')
#compare it to
cProfile.run('fibonacci_mem(15000)')

正如您所看到的,NumPy使用了很多东西来完成任务,因为矩阵方法更复杂。你的代码更简单,它只使用很少的内置东西。 NumPy用于做更复杂的事情,与你写的小函数相比,它会更慢,如果&#39; n&#39;是一个小数字。只要看一下cProfile的解释,就会更加清晰。当然,对于大数和长期而言,NumPy更快。