前情提要
:python在处理高时间复杂度的双重for循环时候效率低,而多线程又不适合于计算密集的任务提速。昨天睡之前让电脑自己运行17000*17000的计算,结果跑了19000秒。
因此尝试寻求为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 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。哟。快了不止一星半点啦。
好啦,今天的博客就到这里啦。
前情提要:python在处理高时间复杂度的双重for循环时候效率低,而多线程又不适合于计算密集的任务提速。昨天睡之前让电脑自己运行17000*17000的计算,结果跑了19000秒。因此尝试寻求为python提速的解决方案。在那之前,我们先了解一下,为什么python这么慢???python为啥这么慢首先可以了解python的运行原理,以下总结都来自于右边链接–> Linkkkkkkkkkkkk1,Linkkkkkkkkkk2,Linkkkkkkkkkkk3python将py文件视为一个mo
box,box1,box2 = [0,1,2],[0,3,4],[0,5,6] # 0,1,2 三个盒子,数字代表球的种类
box3,box4,box5 = [0,5,6],[0,3,4],[0,1,2] # 3,4,5 三个盒子
Box = [box,box1,box2,box3,box4,box5]
count = 0
# methond 1
利用内置函数:使用内置函数可以加速代码的执行,例如 map() 和 filter()。
避免不必要的循环:如果可以直接使用列表推导式或生成器表达式代替 for 循环,则应该使用它们。
利用预先计算:如果可以预先计算某些值,则应该尽量预先计算。
减少循环次数:应该尽量减少循环的次数,例如,使用 while 循环代替 for 循环。