Python 是一种解释型语言,它不需要编译为机器码,在执行的过程中实时被解释器解析执行,因此的它的速度相对于其他的一些编译型语言C/C++,Java等要慢很多,
但Python具有非常大的灵活性,易于上手,所以Python目前是非常受欢迎的编程语言。
如何提高Python的运行速度
提高python的运行速度有很多种方法这里列举两个
1 使用cython将python代码编译为c语言,在linux系统下非常推荐这样做。
2 使用ctypes,pybindll ,CFFI等调用C/C++库
但这些方法使用过程种多少是有一些学习成本的,不太适合刚入门的Python新手,这里推荐Numba库来加速数学类的计算密集型的Python代码。
numba加速计算密集型的代码
按照官网的定义numba将Python代码在运行过程使用工业标准的LLVM编译器库实时优化为机器码,经过numba优化后的python代码可以达到C语言或者FORTRAN的速度。
你不需要替换Python解释器,也不需要安装C/C++编译器,只需要使用numba修饰器修饰Python的函数,剩下的就交给Numba吧。
官网地址是:https://numba.pydata.org/
Numba的用法很丰富,这里只做最容易上手的入门说明
首先安装numba
pip install numba或者conda install numba
下面用大家喜欢用的蒙特卡洛模拟计算 π的代码来对比一下numba的加速效果,简单说明一下这个计算π的原理,蒙特卡洛模拟是使用大量随机逐渐发现真理的算法。下面的算法是说如果你在地上画一个正方形,在正方形中画一个圆,如果你从空中往下扔100万个小球,计算(落在圆形区域的球数)/(落在整个正方形区域内的球数)这个数字会近似π/4

圆型的面积站总面的π/4

蒙特卡洛模拟计算 π加速对比
使用numba只需要在函数上使用@njit来修饰函数即可,从结果来看,代码速度提升超过50倍,效果非常明显。需要注意的一点是numba加速的函数在第一次运行时速度会稍慢,因为第一次需要花费一些编译时间,这里的对比都是使用第二次运行的时间来做对比。
numba还有很多修饰符如下,这里我们只使用最常用的@njit来测试性能,这个修饰符已经满足入门新手的大部分的应用。
· @njit
· @vectorize
· @guvectorize
· @stencil
再举一个复杂一点的例子,我们使用python代码来实现一个低性能的深度机器学习的卷积操作,首先定义一个2d卷积函数

卷积的低性能实现
这个低性能的卷积函数在Python下运行需要15秒左右
使用如下的代码做个测试,代码中使用一个3*3*3的随机卷积核对狗狗图像进行一次卷积

实现的效果就是一次随机的卷积,如下:

代码运行时间是15s左右,下面使用@njit对卷积函数做修饰用同样的代码在做一次卷积测试时间消耗在0.2s左右同样达到了超过50倍的加速。

仅仅使用@njit对同样的代码做修饰
Numba的使用场景