python数组循环语句_Python中循环操作和Numpy数组运算性能优化——Numba使用介绍...

直到遇到Numba,才知道“一行代码让Python的运行速度提高100倍” 的论调 ,并不是哗众取宠。

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

安装过程如下:

使用 jit 加速 Python 低效的 for 语句

jit 的全称是 Just-in-time,在 Numba里面则特指 Just-in-time compilation(

即时编译

),使用Numba来加速代码的运行,简洁易用,Numba 对源代码的修改很小,几乎是只需要加一个 @jit 修饰器就可以了。相对于Cython,使用Numba也是在性能和可读性之间的平衡。

不使用@jit,执行上述代码,发现它平均需要耗时

23

秒的时间。

接下来我们使用@jit,来看一下Numba的效率究竟多么强大。

使用了@jit只用了

0.2

秒,与不使用@jit相比,这已不是同一个数量级了,快了

100

余倍。Numba可以把各种具有很大循环的函数加到很快的速度,相比与Numpy的加速只适用于Numpy自带的函数。但要注意的是,Numba对没有循环或者只有非常小循环的函数加速效果并不明显,用不用都一样。

使用 vectorize 实现 类似于

Numpy

的 Ufunc 功能

在Numpy中有一个非常强大的功能——Ufunc (universal functions),它可以让一个函数同时处理很多数据。比如计算一个数组中每一个元素的三角函数,只需要使用numpy.sin(n)即可,而不是要写个循环遍历计算。

若不用Numpy如何实现高效的计算呢?我们可以使用math.sin,然后写个循环再用numba加速。

除此之外,Numba也有另一个更强大的功能——

矢量化(vectorize)

。像上面的jit一样,只要添加一行

vectorize

修饰器,就可以让普通函数变成Ufunc,如下:

可以看出,用Numba.vectorize 改写的三角函数具有了和np.sin()相同的功能,而且性能表现也不比Numpy差。当遇到Numpy没有的数学函数时

,用Numba矢量化不失为一个好的选择。

除了math中的sin,它支持的其他函数列表可以在 Numba官网的 documentation中查看。

https://github.com/numba/numba

你可能感兴趣的:(python数组循环语句)