计算任务:斐波拉契数列第40项
实现方式:
1、python编译成C后执行计算
2、python实现闭包并编译成C后执行计算
3、python实现递归加速并编译成C后执行计算
4、纯python执行计算
5、纯python实现闭包后执行计算
6、纯python实现递归加速后执行计算
计算结果如下:
python编译成C|斐波拉契数列第40项为:102334155,耗时:9.1068894秒
python实现闭包并编译成C|斐波拉契数列第40项为:102334155,耗时:1.9799999998681983e-05秒
python实现递归加速并编译成C|斐波拉契数列第40项为:102334155,耗时:1.8900000000598993e-05秒
纯python实现|斐波拉契数列第40项为:102334155,耗时:32.1972608秒
纯python实现闭包|斐波拉契数列第40项为:102334155,耗时:1.9200000004104822e-05秒
纯python实现递归加速|斐波拉契数列第40项为:102334155,耗时:2.9099999999004922e-05秒
结论:
纯python实现的递归计算速度真的是惨不忍睹
对比发现将python代码编译成C执行,计算速度上确实有一定提升,但是闭包计算反而慢了一点点
就递归加速而言不编译成C语言执行也仅仅是慢了1.1e-5秒,也就是0.000011秒,这个速度对于绝大多数程序而言已经够快了,所以不是有特别需求的话,直接执行python代码也是可以的
测试代码:
main.py
import time
from fast_fib import fib1,fib2,fib3
import functools
@functools.lru_cache()# 在fibonacci函数上加上装饰器函数functools.lru_cache()
def fib6(n):
if n in [1, 2]:
return 1
return fib6(n - 1) + fib6(n - 2)
def fib4(n):
if n in [1, 2]:
return 1
return fib4(n - 1) + fib4(n - 2)
def fib5():
a=0
b=1
def calc():
nonlocal a,b
a,b = b,a+b
return a
return calc
start = time.perf_counter()
result = fib1(40)
end = time.perf_counter()
print(f'python编译成C|斐波拉契数列第40项为:{result},耗时:{end - start}秒')
start2 = time.perf_counter()
calc_fib2 = fib2()
for i in range(40):
result2 = calc_fib2()
end2 = time.perf_counter()
print(f'python实现闭包并编译成C|斐波拉契数列第40项为:{result2},耗时:{end2 - start2}秒')
start3 = time.perf_counter()
result3 = fib3(40)
end3 = time.perf_counter()
print(f'python实现递归加速并编译成C|斐波拉契数列第40项为:{result3},耗时:{end3 - start3}秒')
start4 = time.perf_counter()
result4 = fib4(40)
end4 = time.perf_counter()
print(f'纯python实现|斐波拉契数列第40项为:{result4},耗时:{end4 - start4}秒')
start5 = time.perf_counter()
calc_fib5 = fib5()
for i in range(40):
result5 = calc_fib5()
end5 = time.perf_counter()
print(f'纯python实现闭包|斐波拉契数列第40项为:{result5},耗时:{end5 - start5}秒')
start6 = time.perf_counter()
result6 = fib6(40)
end6 = time.perf_counter()
print(f'纯python实现递归加速|斐波拉契数列第40项为:{result6},耗时:{end6 - start6}秒')
库 fast_fib 是将fast_fib.pyx编译成C/C++编写的pyd文件
具体pyx编译成pyd的方法请看这篇文章
代码:
fast_fib.pyx
import functools
def fib1(n):
if n in [1, 2]:
return 1
return fib1(n - 1) + fib1(n - 2)
def fib2():
a=0
b=1
def calc():
nonlocal a,b
a,b = b,a+b
return a
return calc
@functools.lru_cache()# 在fibonacci函数上加上装饰器函数functools.lru_cache()
def fib3(n):
if n in [1, 2]:
return 1
return fib3(n - 1) + fib3(n - 2)