python 计算速度比较

计算任务:斐波拉契数列第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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值