python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍

python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片

直到遇到Numba,才知道“一行代码让Python的运行速度提高100倍” 的论调 ,并不是哗众取宠。
Numba【python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍】Numba最初是由Continuum Analytics内部开发,此公司也开发了著名的Anaconda,但现在它是开源的。
Numba是Python的即时编译器,它最适用于使用NumPy数组和函数以及循环的代码,能够大幅提高直接使用Python编写的函数的运算速度。
Numba使用行业标准的LLVM编译器库在运行时将Python函数转换为优化的机器代码。 Python中的Numba编译数值算法可以接近C、C++或Fortran的速度,且无需改变Python的解释器。只需将其中一个Numba装饰器应用到Python函数中,Numba就会完成剩下的工作。
专为科学计算而生 Python 本身由于其动态语言的本质,并不适合于计算量很大的科学计算。然而 Numpy 提供的带类型的数据结构,以及预编译好的基于 C 或 Fortran 的高速计算库,补足了Python计算性能短板,而Numba无疑直接给Python计算性能装了一个发动机。
Numba旨在与NumPy阵列和功能一起使用。 Numba为不同的阵列数据类型和布局生成专门的代码,特殊装饰器可以创建通用功能,可以像NumPy函数那样在NumPy数组上进行广播。同时鉴于可以支持异构计算,加速效果可能比裸C写得还好。这对于那些用Python做高密度的计算或者人工智能的场景而言非常有效。
Numba还可以与Jupyter配合使用,实现交互式计算,以及分布式执行框架,如Dask、Spark。
Numba的主要特性:
  • 动态代码生成
  • 为CPU和GPU硬件生成原生的代码
  • 集成Python的科学计算库Numpy
支持环境 开箱即用的Numba支持以下环境:
  • Intel和AMD x86,POWER8 、 9
  • ARM CPU、NVIDIA和AMD GPU
  • Python 2.7 和 3.4+
  • Windows 、macOS 、Linux
大多数系统的预编译Numba二进制文件可用作conda软件包和pip可安装的轮子。
安装 Numba在 Windows10,Python3环境中使用pip 进行安装:
pip install numba

安装过程如下:
python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片
使用 jit 加速 Python 低效的 for 语句 jit 的全称是 Just-in-time,在 Numba里面则特指 Just-in-time compilation(即时编译),使用Numba来加速代码的运行,简洁易用,Numba 对源代码的修改很小,几乎是只需要加一个 @jit 修饰器就可以了。相对于Cython,使用Numba也是在性能和可读性之间的平衡。
python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片
不使用@jit,执行上述代码,发现它平均需要耗时23秒的时间。
接下来我们使用@jit,来看一下Numba的效率究竟多么强大。
python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片
使用了@jit只用了0.2秒,与不使用@jit相比,这已不是同一个数量级了,快了100余倍。Numba可以把各种具有很大循环的函数加到很快的速度,相比与Numpy的加速只适用于Numpy自带的函数。但要注意的是,Numba对没有循环或者只有非常小循环的函数加速效果并不明显,用不用都一样。
使用 vectorize 实现 类似于Numpy 的 Ufunc 功能 在Numpy中有一个非常强大的功能——Ufunc (universal functions),它可以让一个函数同时处理很多数据。比如计算一个数组中每一个元素的三角函数,只需要使用numpy.sin(n)即可,而不是要写个循环遍历计算。
python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片
若不用Numpy如何实现高效的计算呢?我们可以使用math.sin,然后写个循环再用numba加速。
除此之外,Numba也有另一个更强大的功能——矢量化(vectorize)。像上面的jit一样,只要添加一行vectorize修饰器,就可以让普通函数变成Ufunc,如下:
python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片
可以看出,用Numba.vectorize 改写的三角函数具有了和np.sin()相同的功能,而且性能表现也不比Numpy差。当遇到Numpy没有的数学函数时,用Numba矢量化不失为一个好的选择。除了math中的sin,它支持的其他函数列表可以在 Numba官网的 documentation中查看。
想要了解更多Numba使用 可以,进一步阅读GitHub :
https://github.com/numba/numba
python|python 循环加速_一行代码实现Python运行性能增强,性能发动机Numba模块介绍
文章图片

    推荐阅读