术语表

预先编译
AOT 编译
AOT

在运行程序代码之前,单独步骤中编译一个函数,生成一个可以独立分发的磁盘二进制对象。这是在C、C++或Fortran等语言中已知的传统编译方式。

字节码
Python 字节码

Python 函数执行的原始形式。Python 字节码描述了一个使用函数堆栈和执行环境(例如全局变量)中的操作数执行抽象(无类型)操作的堆栈机器。

编译时常量

Numba 可以在编译时推断并冻结其值的表达式。全局变量和闭包变量是编译时常量。

即时编译
JIT 编译
JIT

在执行时编译函数,与 提前编译 相对。

JIT 函数

“一个使用 Numba 的 @jit 装饰器 即时编译 的函数” 的简写。

提升的循环
循环提升
loop-jitting

对象模式 编译中的一个特性,其中循环可以自动提取并在 nopython 模式 中编译。这使得包含仅支持 nopython 操作的循环的函数,即使它们包含在 nopython 模式下不支持的操作,也能看到显著的性能提升。

降低

Numba IR 翻译成 LLVM IR 的行为。术语“lowering”源于 LLVM IR 是低级别的、特定于机器的,而 Numba IR 是高级别的、抽象的。

NPM
nopython 模式

一种Numba编译模式,生成不访问Python C API的代码。此编译模式产生最高性能的代码,但要求函数中所有值的本地类型可以 推断

备注

在 Numba 0.59 之前,@jit 默认不设置 nopython=True,并允许自动回退到 对象模式

Numba IR
Numba 中间表示

一种对Python代码的表示,它比原始的Python 字节码 更易于分析和转换。

对象模式

一种Numba编译模式,生成处理所有值为Python对象的代码,并使用Python C API对这些对象执行所有操作。在对象模式下编译的代码通常不会比Python解释代码运行得更快,除非Numba编译器能够利用 循环即时编译

OptionalType

一个 OptionalType 实际上是一个 typeNone 的类型联合。它们通常在实践中出现,因为一个变量被设置为 None,然后在某个分支中,该变量被设置为其他值。通常在编译时无法确定分支是否会执行,因此为了允许 类型推断 完成,变量的类型变成了一个 type``(来自值)和 ``None 的联合,即 OptionalType(type)

类型推断

Numba 确定正在编译的函数中所有值的专用类型的过程。如果参数或全局变量具有 Numba 未知的 Python 类型,或者使用了 Numba 无法识别的函数,类型推断可能会失败。成功的类型推断是 nopython 模式 下编译的先决条件。

typing

对一个值或操作进行 类型推断 的行为。

ufunc

一个 NumPy 通用函数。Numba 可以使用 @vectorize 装饰器创建新的编译通用函数。

反射

在 numba 中,当一个可变容器作为参数从 Python 解释器传递给 nopython 函数时,容器对象及其所有包含的元素都会被转换为 nopython 值。为了匹配 Python 的语义,nopython 函数内部对容器的任何修改都必须对 Python 解释器可见。为此,Numba 必须在返回解释器的过程中更新容器及其元素,并将它们转换回 Python 对象。

不要与Python在二元运算符上下文中的“反射”混淆(参见https://docs.python.org/3.5/reference/datamodel.html)。