Я попробовал два алгоритма для ряда Фибоначчи и сравнил скорость.
Первый - по степеням матриц через Numpy (я также написал свою собственную функцию, но Numpy, кажется, быстрее).
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]
Вторым является динамическое программирование с укороченной памятью.
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]
Временная сложность первого равна O (log n) , а второго - O(п) .Так что для больших n первый должен быть быстрее.
Я сравниваю их скорость следующим образом:
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))
Результат:
Power/Numpy result: 2880067194370816120 time: 0.00021696090698242188
Memory result: 2880067194370816120 time: 4.410743713378906e-05
Правильно ли я сравниваю их скорость?Если да, может кто-нибудь объяснить, почему второй быстрее?Спасибо.