添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

前情提要 :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。哟。快了不止一星半点啦。

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

前情提要: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 循环