我尝试了两种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))
我是否以正确的方式比较他们的速度?如果是,有人可以解释为什么第二个更快?感谢。
答案 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更快。