前情提要:python在处理高时间复杂度的双重for循环时候效率低,而多线程又不适合于计算密集的任务提速。昨天睡之前让电脑自己运行17000*17000的计算,结果跑了19000秒。
因此尝试寻求为python提速的解决方案。在那之前,我们先了解一下,为什么python这么慢???
python为啥这么慢
首先可以了解python的运行原理,以下总结都来自于右边链接–> Linkkkkkkkkkkkk1,Linkkkkkkkkkk2,
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。哟。快了不止一星半点啦。
好啦,今天的博客就到这里啦。