python日记(二):密集计算加速(双重for循环为例)

前情提要:python在处理高时间复杂度的双重for循环时候效率低,而多线程又不适合于计算密集的任务提速。昨天睡之前让电脑自己运行17000*17000的计算,结果跑了19000秒。
因此尝试寻求为python提速的解决方案。在那之前,我们先了解一下,为什么python这么慢???

python为啥这么慢

首先可以了解python的运行原理,以下总结都来自于右边链接–> Linkkkkkkkkkkkk1Linkkkkkkkkkk2,
Linkkkkkkkkkkk3
python将py文件视为一个module,python的解释器在执行模块的时候将其编译成字节码对象 PyCodeObject,在编译完成之后,编译的结果被保留在 pyc 文件中。pyc 文件只是 PyCodeObject 对象在硬盘上的表现形式,一个 pyc 文件包含了三部分信息:Python 的 magic number、pyc 文件创建的时间信息,以及 PyCodeObject 对象。这个文件主要是为了方便下次的重用。
接下来,python虚拟机会从编译得到的 PyCodeObject 对象中依次读入每一条字节码指令,并在当前的上下文环境中执行这条字节码指令。我们的程序就是通过这样循环往复的过程才得以执行。可以用如下的图来阐述这个过程:
在这里插入图片描述
而python之所以慢,在很大程度上是因为python是弱类型语言,在声明数值的时候,不用int a = 1,而是直接 a=1。
因此,与C 比起来,编译器一开始并不知道我这个a是啥,编译器就需要更多的响应和准备时间来执行。
并且,C编译器直接把C源代码编译成机器码,并没有中间的pyc文件作为媒介,因此,python的速度是大大不如C的。
那这是不是就意味着python不可救药了呢?NO,Cython、numba等等说还可以抢救。接下来就介绍Numba

Numba

我们来看一眼官网的介绍:
Numba is an open source JIT compiler that translates a subset of Python and NumPy code into fast machine code.。这句话大概是说,Numba能将python编译成更快的机器码。
在这里插入图片描述
接下里我们就实战看看numba到底好在哪里。先搞一个5000×5000次的加法运算。

from numba import jit
import time
def add_ab():
    a = list(range(5000))
    b = list(range(5000))
    start = time.time()
    for i in range(5000):
        for j in range(5000):
            c = a[i] + b[j]
    print(time.time()-start)
add_ab()

>>>1.64385986328125

执行时间是1.64385986328125秒。然后再试一试添加numba:

from numba import jit
import time
@jit()
def add_ab():
    a = list(range(5000))
    b = list(range(5000))
    start = time.time()
    for i in range(5000):
        for j in range(5000):
            c = a[i] + b[j]
    print(time.time()-start)
add_ab()

>>>0.18350887298583984

执行时间是0.18350887298583984。哟。快了不止一星半点啦。

好啦,今天的博客就到这里啦。

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的echo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值