Numba加速Python教程

Numba加速Python代码教程

  • Numba介绍
    • Numba可运行环境
  • Numba安装
  • Numba教程
    • Numba简单示例
    • Numba装饰器
    • Numba理解
      • 什么是nopython模式?
      • 如何衡量Numba的性能?
      • Numba可以多快
      • Numba如何工作

以下内容来自官网教程:http://numba.pydata.org/numba-doc/latest/user/5minguide.html

Numba介绍

Numba是Python的即时编译器,在使用NumPy数组和函数以及循环的代码上效果最佳。 使用Numba的最常见方法是通过其装饰器集合,这些装饰器可应用于您的函数以指示Numba对其进行编译。 调用带有Numba装饰的函数时,该函数将被“即时”编译为机器代码以执行,并且您的全部或部分代码随后可以本机机器速度运行!

Numba可运行环境

  • 系统: Windows (32 and 64 bit), OSX and Linux (32 and 64 bit)
  • 架构:x86,x86_64,ppc64le。在armv7l,armv8l(aarch64)上进行实验。
  • GPU:Nvidia CUDA。在AMD ROC上进行实验。
  • CPython
  • NumPy 1.15-最新

Numba安装

conda install numba或者是pip install numba

Numba通常用作核心软件包,因此其依赖关系保持在绝对最低限度,但是,可以按如下所示安装其他软件包以提供其他功能

  • scipy-支持编译numpy.linalg函数。
  • colorama-支持在回溯/错误消息中突出显示颜色。
  • pyyaml-通过YAML配置文件启用Numba的配置。
  • icc_rt-允许使用Intel SVML(高性能短向量数学库,仅x86_64)。安装说明在性能提示中。

安装方法:

pip install scipy
pip install colorama
pip install PyYAML
pip install icc-rt

Numba教程

Numba简单示例

Numba是否高效取决于代码,如果代码是数字定向的(做大量的数学运算),使用NumPy很多和/或有很多循环,那么Numba通常是一个不错的选择。

Numba在如下所示的代码上运行良好

from numba import jit
import numpy as np

x = np.arange(100).reshape(10, 10)

@jit(nopython=True) # Set "nopython" mode for best performance, equivalent to @njit
def go_fast(a): # Function is compiled to machine code when called the first time
    trace = 0
    for i in range(a.shape[0]):   # Numba likes loops
        trace += np.tanh(a[i, i]) # Numba likes NumPy functions
    return a + trace              # Numba likes NumPy broadcasting

print(go_fast(x))

如果是这样的话,它将无法很好地工作:请注意**,Numba无法理解Pandas**,因此Numba只需通过解释器运行此代码,但会增加Numba内部开销!

from numba import jit
import pandas as pd

x = {
     'a': [1, 2, 3], 'b': [20, 30, 40]}

@jit
def use_pandas(a): # Function will not benefit from Numba jit
    df = pd.DataFrame.from_dict(a) # Numba doesn't know about pd.DataFrame
    df += 1                        # Numba doesn't understand what this is
    return df.cov()                # or this!

print(use_pandas(x))

Numba装饰器

Numba有很多装饰器,我们已经看到了@jit,但是还有:
Numba加速Python教程_第1张图片一些装饰器中可用的其他选项:

在这里插入图片描述
ctypes/cffi/cython 互操作性:

在这里插入图片描述

Numba理解

什么是nopython模式?

Numba @jit装饰器基本上在两种编译模式下运行,即nopython模式对象模式

在上面的go_fast示例中,在@jit装饰器中设置了nopython = True,这指示Numba在nopython模式下运行。 nopython编译模式的行为是实质上编译装饰后的函数,以便其完全运行而无需Python解释器的参与。 这是使用Numba jit装饰器的推荐和最佳实践方法,因为它可以带来最佳性能

如果nopython模式下的编译失败,Numba可以使用对象模式进行编译,如果未设置nopython = True,则这是@jit装饰器的后备模式(如上述use_pandas示例所示)。 在这种模式下,Numba将识别可以编译的循环并将其编译为在机器代码中运行的函数,并在解释器中运行其余代码。 为了获得最佳性能,请避免使用此模式!

如何衡量Numba的性能?

首先,回想一下,Numba必须在执行函数的机器代码版本之前针对给定的参数类型编译函数。 但是,一旦编译完成,Numba会为呈现的特定类型的参数缓存函数的机器代码版本。 如果使用相同类型再次调用,则它可以重用缓存的版本,而不必再次编译。

衡量性能时,一个真正常见的错误是不考虑上述行为,并使用一个简单的计时器对代码进行一次计时,该计时器包括在执行时间中编译函数所花费的时间。

衡量Numba JIT对您的代码的影响的一种好方法是使用timeit模块函数对执行时间进行计时,这些函数测量执行的多次迭代,因此可以适应第一次执行时的编译时间。

附带说明一下,如果需要考虑编译时间,则Numba JIT支持在磁盘上缓存已编译函数,并且还具有“提前”编译模式

Numba可以多快

假设Numba可以在nopython模式下运行,或者至少编译一些循环,它将把编译目标对准您的特定CPU。 加速因应用而异,但可以是一到两个数量级。 Numba的性能指南涵盖了获得额外性能的常见选项。

Numba如何工作

Numba读取装饰函数的Python字节码,并将其与有关函数输入参数类型的信息结合起来。 它分析和优化您的代码,最后使用LLVM编译器库生成针对您的CPU功能量身定制的函数的机器代码版本。 每次调用函数时,都会使用此编译版本。

你可能感兴趣的:(python学习,python,python加速,numba)