# 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. 術語表