原创 菜鸟哥 菜鸟学Python 2020-04-21

收录于话题

#趣味Python

107个

点击关注上方“菜鸟学Python”,

设为“置顶或星标”,第一时间送达干货。

我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python


对于Python编程,大家想必都或多或少的掌握了不少知识点,但是python为人所诟病的一大缺点是其运行速度比较慢


其中一大主要的原因是python是动态的,解释性的语言,而非静态的语言。而这就意味着python解释器在执行程序时,并不知道变量的具体类型。


例如C++程序中,int a = 0;那么在程序的运行过程中,C++解释器始终知道变量a是一个int类型,而在python中,编程语言变为a = 0。则python解释器必须检查每个变量的PyObject_HEAD属性才能确定变量类型,例如:


我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python_02


所以对于python编程的每一步都会有更多的步骤进行支撑,因此python的程序执行都比较慢。那么,我们该如何提升我们的python运行速度呢,今天小编就为大家介绍一下加速python程序的5大方法。在后面的程序效率对比上,我们以下面的python程序作为基础对比程序。

我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python_03


01.优化编写的代码

对于python程序,大家可以首先将程序的目的实现,然后在这个基础之上,分析程序执行效率低下的部分并实现优化,然后不断的执行这个分析效率-优化的步骤。对于效率低下的操作,可以采用python的内置高阶函数等方式进行加速,如下图所示:


我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python_04

上图程序中,我们分别使用for循环函数和python内置高阶map函数实现了列表中元素的平方,结果显示,使用map函数,速度是原先的1.12倍。


02.Cython

Cython的语法同Python的语法类似,cython通过编写可以被python调用的C扩展,是其既具备了Python的语法特点,同时又有了像C语言一样的程序运行速度,此外,Cython还可以方便的调用C的包。下图给出的程序,展示的是利用cython进行开发时在运行速度上相较于python的提升。


上图可以看出,通过cython,虽然程序上没有区别,但是在运行速度上cython提升了1.5倍左右。


03.使用多线程

在进程执行当中,可以有多个线程同时进行执行,但是每个线程可以执行不同的任务,对于多线程,这里不做过多的解释,我们直接用一个简单的程序来展示多线程。


上述的程序中,我们使用多线程来实现我们的Pow_2函数,可以看到多线程同样起到了加速python程序执行,这里还需注意一点是我们使用多线程往一个公共的pow_list中添加数据,由于这是我们期望的,所以不需要添加线程锁来进行保护。



04.使用numba库

对于numba,官网对它本身的定义为“python的解释器”。对于numba库的详尽解释,这里小编给大家一个纽约大学的网站,大家可以通过这个网站的讲解,对numba有更加全面的了解。

https://nyu-cds.github.io/python-numba/

对于numba库的简单方法,最简单的是在函数定义的前面加上@jit装饰器

我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python_05

上述程序中,我们在Pow_2函数前加上了jit装饰器,运行结果显示,其运行速度是基础方法的2.34倍左右,大大的缩短了程序的执行时间。



05.使用多进程

对于python的多进程,python内置了多进程包multiprocessing,我们只需要定义一个函数,便可以借助multiprocessing包,轻松的实现从单进程到并发执行的转换。

我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python_06

上述程序中,我们创建了4个进程,并实现了将数组元素进行平方的功能,从结果可以看出,多进程实现了真正的并行,使得程序的运行时间大大缩短,运行速度达到了基础程序的3.05倍。


06.尽可能使用numpy、pandas等科学计算库

使用科学计算库不仅可以帮助我们简化代码,提升代码可读性,而且其高效的数据处理效率可以大大提升我们的程序执行速度。

我打赌,学会这6招,谁再敢笑你的Python程序慢!尤其是最后一大招!_Python_07

上图中,我们使用numpy来完成相同的效果,即对列表中的每个元素都实行平方。这里我们先将原始的列表origin_list转化numpy的数组,然后直接对数组进行平方。注意这样的操作对于列表对象来说是不合法的。从上面的程序来看,使用numpy既大大简化了程序,而且也大大的提升了程序的执行效率,提高了65倍啊!!对于数据处理来说,是非常友好的




上述的6个python运行效率提升的方法中,既有从程序本身入手进行提升,也有利用进程、线程技术和python+C的方法进行实现。大家可以在以后的程序编写中,在需要提升运行效率的时候,参考这几种方式,提升自己python程序的运行效率。