附录A 高阶Numpy
A.7 使用Numba编写快速NumPy函数
Numba(http://numba.pydata.org)是一个开源项目,可为使用CPU、GPU或其他硬件的NumPy类型的数据创建快速函数。它使用LLVM Project(http://llvm.org)将Python代码翻译成编译后的机器码。
1.让我们考虑一个纯Python函数,该函数使用for循环计算表达式(x - y).mean()的值(见图A-1)
2.NumPy的版本要快100倍。我们可以使用numba.jit函数将这个函数编译成Numba函数(见图A-2)
Numba不能编译所有的Python代码,但它支持纯Python代码的重要子集,这些代码对于编写数值算法最为有用。
Numba是一个有深度的类库,支持各种不同的硬件、兼容模式和用户拓展。它还可以在不显式使用for循环的情况下兼容NumPy的Python API。Numba能够识别可以编译为机器代码的构造,同时将不知道如何编译的函数的调用替换为CPython API。Numba的jit函数有一个选项,nopython=True,它将允许的代码限制为可以编译为LLVM的Python代码,而无须调用任何Python的C语言API。jit(nopython=True)有一个更短的别名numba.njit。
在之前的例子中,我们可以写为(见图A-3)
推荐通过阅读Numba的官方在线文档(http://numba.pydata.org)来学习更多内容。下一节将会展示一个创建自定义NumPy ufunc对象的例子。
A.7.1 使用Numba创建自定义numpy.ufunc对象
numba.vectorize函数创建了编译好的NumPy ufunc,其行为也和内建的ufunc类似。
让我们考虑一个numpy.add的Python实现