《利用Python进行数据分析》 附录 A.7 使用Numba编写快速NumPy函数

附录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)

15259227-7cc158f426ef2f04.png
图A-1:纯Python函数

2.NumPy的版本要快100倍。我们可以使用numba.jit函数将这个函数编译成Numba函数(见图A-2)

15259227-5008f05ddbbe5926.png
图A-2:编译Numba函数

       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)

15259227-311545ac94467b2d.png
图A-3:改写例子

       推荐通过阅读Numba的官方在线文档(http://numba.pydata.org)来学习更多内容。下一节将会展示一个创建自定义NumPy ufunc对象的例子。


A.7.1 使用Numba创建自定义numpy.ufunc对象

       numba.vectorize函数创建了编译好的NumPy ufunc,其行为也和内建的ufunc类似。

让我们考虑一个numpy.add的Python实现

15259227-8b76c017093c9928.png
图A-4:numpy.add的Python实现

猜你喜欢

转载自blog.csdn.net/weixin_33856370/article/details/87231612
今日推荐