术语表
- 预先编译
- AOT 编译
- AOT
在运行程序代码之前,单独步骤中编译一个函数,生成一个可以独立分发的磁盘二进制对象。这是在C、C++或Fortran等语言中已知的传统编译方式。
- 字节码
- Python 字节码
Python 函数执行的原始形式。Python 字节码描述了一个使用函数堆栈和执行环境(例如全局变量)中的操作数执行抽象(无类型)操作的堆栈机器。
- 编译时常量
Numba 可以在编译时推断并冻结其值的表达式。全局变量和闭包变量是编译时常量。
- 即时编译
- JIT 编译
- JIT
在执行时编译函数,与 提前编译 相对。
- 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
实际上是一个type
和None
的类型联合。它们通常在实践中出现,因为一个变量被设置为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)。