# 6.2。低级扩展 API
> 原文: [http://numba.pydata.org/numba-doc/latest/extending/low-level.html](http://numba.pydata.org/numba-doc/latest/extending/low-level.html)
此扩展 API 可通过 [`numba.extending`](index.html#module-numba.extending "numba.extending") 模块获得。它允许您直接挂钩到 Numba 编译链。因此,它区分了几个编译阶段:
* [输入](../glossary.html#term-typing)阶段通过查看执行的操作来推断编译函数中的变量类型。
* [降低](../glossary.html#term-lowering)阶段将高级 Python 操作转换为低级 LLVM 代码。此阶段利用由键入阶段导出的键入信息。
* _ 拳击 _ 和 _ 拆箱 _ 将 Python 对象转换为本机值,反之亦然。它们出现在从 Python 解释器调用 Numba 函数的边界。
## 6.2.1。输入
类型推断 - 或简单地 _ 输入 _ - 是将 Numba 类型分配给函数中涉及的所有值的过程,以便实现高效的代码生成。从广义上讲,键入有两种形式:键入普通 Python _ 值 _(例如函数参数或全局变量)并在已知值类型上键入 _ 操作 _(或 _ 函数 _) 。
```py
@typeof_impl.register(cls)
```
将装饰函数注册为键入类 _cls_ 的 Python 值。装饰函数将使用签名`(val, c)`调用,其中 _val_ 是键入的 Python 值, _c_ 是上下文对象。
```py
@type_callable(func)
```
将装饰函数注册为键入可调用 _func_ 。 _func_ 可以是实际的 Python 可调用函数,也可以是表示 Numba 内部已知的操作的字符串(例如`'getitem'`)。使用单个 _ 上下文 _ 参数调用修饰函数,并且必须返回一个 typer 函数。 typer 函数应该与被键入的函数具有相同的签名,并且使用函数参数的 Numba _ 类型 _ 调用它;它应该返回函数返回值的 Numba 类型,或者如果推理失败则返回`None`。
## 6.2.2。降低
以下装饰器都采用某种类型的规范。类型规范通常是类型类(例如`types.Float`)或特定类型实例(例如`types.float64`)。有些值具有特殊含义:
* `types.Any`匹配任何类型;这允许在实现中进行自己的调度
* `types.VarArg(<some type>)`匹配给定类型的任意数量的参数;它只能在描述函数的参数时显示为最后一个类型规范。
以下 API 中的 _ 上下文 _ 参数是一个目标上下文,为代码生成提供各种实用程序方法(例如创建常量,从类型转换为另一种,查找特定函数的实现等) 。 _ 构建器 _ 参数是生成的 LLVM 代码的 [`llvmlite.ir.IRBuilder`](http://llvmlite.pydata.org/en/latest/user-guide/ir/ir-builder.html#llvmlite.ir.IRBuilder "(in llvmlite v0.27.0)") 实例。
_ 签名 _ 是指定操作的具体类型的对象。签名的`args`属性是参数类型的元组。签名的`return_type`属性是操作应返回的类型。
注意
Numba 总是以 Numba 类型为由,但在降低期间传递的值是 LLVM 值:它们不包含所需的类型信息,这也是 Numba 类型也被明确传递的原因。
LLVM 有自己的,非常低级的类型系统:您可以通过查找其`.type`属性来访问值的 LLVM 类型。
### 6.2.2.1。原生作业
```py
@lower_builtin(func, typespec, ...)
```
将装饰函数注册为为给定 Numba _typespecs_ 描述的参数实现可调用 _func_ 。与 [`type_callable()`](#type_callable "type_callable") 一样, _func_ 既可以是实际的 Python 可调用字符串,也可以是表示 Numba 内部已知的操作的字符串(例如`'getitem'`)。
使用四个参数`(context, builder, sig, args)`调用修饰函数。 `sig`是调用 callable 的具体签名。 `args`是调用 callable 的参数值的元组; `args`中的每个值对应于`sig.args`中的类型。该函数必须返回与`sig.return_type`类型兼容的值。
```py
@lower_getattr(typespec, name)
```
将装饰函数注册为实现给定 _typespec_ 的属性 _ 名称 _。使用四个参数`(context, builder, typ, value)`调用修饰函数。 _typ_ 是正在查找属性的具体类型。 _ 值 _ 是要查找属性的值。
```py
@lower_getattr_generic(typespec)
```
将装饰函数注册为给定 _typespec_ 上的属性查找的后备。任何没有相应 [`lower_getattr()`](#lower_getattr "lower_getattr") 声明的属性都将通过 [`lower_getattr_generic()`](#lower_getattr_generic "lower_getattr_generic") 。使用五个参数`(context, builder, typ, value, name)`调用修饰函数。 _typ_ 和 _ 值 _ 与 [`lower_getattr()`](#lower_getattr "lower_getattr") 相同。 _ 名称 _ 是要查找的属性的名称。
```py
@lower_cast(fromspec, tospec)
```
将装饰函数注册为从 _ 从 specpec_ 描述的类型转换为 _tospec_ 描述的类型。装饰函数使用五个参数`(context, builder, fromty, toty, value)`调用。 _fromty_ 和 _toty_ 分别是从和转换的具体类型。 _ 值 _ 是要转换的值。该函数必须返回与`toty`类型兼容的值。
### 6.2.2.2。常数
```py
@lower_constant(typespec)
```
将装饰函数注册为实现 Numba _typespec_ 的常量创建。使用四个参数`(context, builder, ty, pyval)`调用修饰函数。 _ty_ 是为其创建常量的具体类型。 _pyval_ 是转换为 LLVM 常量的 Python 值。该函数必须返回与`ty`类型兼容的值。
### 6.2.2.3。拳击和拆箱
在这些函数中, _c_ 是一个具有多个属性的便利对象:
* 其`context`属性是上述目标上下文
* 其`builder`属性如上所述为 [`llvmlite.ir.IRBuilder`](http://llvmlite.pydata.org/en/latest/user-guide/ir/ir-builder.html#llvmlite.ir.IRBuilder "(in llvmlite v0.27.0)")
* 它的`pyapi`属性是一个对象,可以访问 [Python 解释器的 C API](https://docs.python.org/3/c-api/index.html) 的子集
与本机值相反,对象是`PyObject *`指针。这些指针可以通过`pyapi`对象中的方法生成或处理。
```py
@box(typespec)
```
将装饰函数注册为与 _typespec_ 匹配的装箱值。使用三个参数`(typ, val, c)`调用修饰函数。 _typ_ 是盒装的具体类型。 _val_ 是装箱的值。该函数应返回 Python 对象,或 NULL 以表示错误。
```py
@unbox(typespec)
```
将装饰函数注册为与 _typespec_ 匹配的拆箱值。使用三个参数`(typ, obj, c)`调用修饰函数。 _typ_ 是未装箱的具体类型。 _obj_ 是未装箱的 Python 对象(C 语言中的`PyObject *`指针)。该函数应该返回一个`NativeValue`对象,给出取消装箱结果值和一个可选的错误位。
- 1. 用户手册
- 1.1。 Numba 的约 5 分钟指南
- 1.2。概述
- 1.3。安装
- 1.4。使用@jit 编译 Python 代码
- 1.5。使用@generated_jit 进行灵活的专业化
- 1.6。创建 Numpy 通用函数
- 1.7。用@jitclass 编译 python 类
- 1.8。使用@cfunc 创建 C 回调
- 1.9。提前编译代码
- 1.10。使用@jit 自动并行化
- 1.11。使用@stencil装饰器
- 1.12。从 JIT 代码 中回调到 Python 解释器
- 1.13。性能提示
- 1.14。线程层
- 1.15。故障排除和提示
- 1.16。常见问题
- 1.17。示例
- 1.18。会谈和教程
- 2. 参考手册
- 2.1。类型和签名
- 2.2。即时编译
- 2.3。提前编译
- 2.4。公用事业
- 2.5。环境变量
- 2.6。支持的 Python 功能
- 2.7。支持的 NumPy 功能
- 2.8。与 Python 语义的偏差
- 2.9。浮点陷阱
- 2.10。 Python 2.7 寿命终止计划
- 3. 用于 CUDA GPU 的 Numba
- 3.1。概述
- 3.2。编写 CUDA 内核
- 3.3。内存管理
- 3.4。编写设备功能
- 3.5。 CUDA Python 中支持的 Python 功能
- 3.6。支持的原子操作
- 3.7。随机数生成
- 3.8。设备管理
- 3.10。示例
- 3.11。使用 CUDA 模拟器 调试 CUDA Python
- 3.12。 GPU 减少
- 3.13。 CUDA Ufuncs 和广义 Ufuncs
- 3.14。共享 CUDA 内存
- 3.15。 CUDA 阵列接口
- 3.16。 CUDA 常见问题
- 4. CUDA Python 参考
- 4.1。 CUDA 主机 API
- 4.2。 CUDA 内核 API
- 4.3。内存管理
- 5. 用于 AMD ROC GPU 的 Numba
- 5.1。概述
- 5.2。编写 HSA 内核
- 5.3。内存管理
- 5.4。编写设备功能
- 5.5。支持的原子操作
- 5.6。代理商
- 5.7。 ROC Ufuncs 和广义 Ufuncs
- 5.8。示例
- 6. 扩展 Numba
- 6.1。高级扩展 API
- 6.2。低级扩展 API
- 6.3。示例:间隔类型
- 7. 开发者手册
- 7.1。贡献给 Numba
- 7.2。 Numba 建筑
- 7.3。多态调度
- 7.4。关于发电机的注意事项
- 7.5。关于 Numba Runtime 的注意事项
- 7.6。使用 Numba Rewrite Pass 获得乐趣和优化
- 7.7。实时变量分析
- 7.8。上市
- 7.9。模板注释
- 7.10。关于自定义管道的注意事项
- 7.11。环境对象
- 7.12。哈希 的注意事项
- 7.13。 Numba 项目路线图
- 8. Numba 增强建议
- 9. 术语表