# 6.1。高級擴展 API
> 原文: [http://numba.pydata.org/numba-doc/latest/extending/high-level.html](http://numba.pydata.org/numba-doc/latest/extending/high-level.html)
此擴展 API 通過 [`numba.extending`](index.html#module-numba.extending "numba.extending") 模塊公開。
## 6.1.1。實現功能
`@overload`裝飾器允許您實現在 [nopython 模式](../glossary.html#term-nopython-mode)功能中使用的任意函數。用`@overload`修飾的函數在編譯時使用函數運行時參數的 _ 類型 _ 調用。它應該返回一個 callable,表示給定類型的函數的 _ 實現 _。返回的實現由 Numba 編譯,就像它是用`@jit`修飾的普通函數一樣。 `@jit`的其他選項可以使用`jit_options`參數作為字典傳遞。
例如,讓我們假裝 Numba 不支持元組上的 [`len()`](https://docs.python.org/3/library/functions.html#len "(in Python v3.7)") 函數。以下是使用`@overload`實現它的方法:
```py
from numba import types
from numba.extending import overload
@overload(len)
def tuple_len(seq):
if isinstance(seq, types.BaseTuple):
n = len(seq)
def len_impl(seq):
return n
return len_impl
```
您可能想知道,如果使用除元組以外的其他內容調用 [`len()`](https://docs.python.org/3/library/functions.html#len "(in Python v3.7)") 會發生什么?如果用`@overload`修飾的函數不返回任何內容(即返回 None),則嘗試其他定義直到成功。因此,多個庫可能會使 [`len()`](https://docs.python.org/3/library/functions.html#len "(in Python v3.7)") 超載不同類型,而不會相互沖突。
## 6.1.2。實施方法
`@overload_method`裝飾器類似地允許在 Numba 眾所周知的類型上實現方法。以下示例在 Numpy 數組上實現 [`take()`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.take.html#numpy.ndarray.take "(in NumPy v1.16)") 方法:
```py
@overload_method(types.Array, 'take')
def array_take(arr, indices):
if isinstance(indices, types.Array):
def take_impl(arr, indices):
n = indices.shape[0]
res = np.empty(n, arr.dtype)
for i in range(n):
res[i] = arr[indices[i]]
return res
return take_impl
```
## 6.1.3。實現屬性
`@overload_attribute`裝飾器允許在類型上實現數據屬性(或屬性)。只能讀取屬性;只有[低級 API](low-level.html#low-level-extending) 支持可寫屬性。
以下示例在 Numpy 數組上實現 [`nbytes`](https://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.nbytes.html#numpy.ndarray.nbytes "(in NumPy v1.16)") 屬性:
```py
@overload_attribute(types.Array, 'nbytes')
def array_nbytes(arr):
def get(arr):
return arr.size * arr.itemsize
return get
```
## 6.1.4。導入 Cython 函數
函數`get_cython_function_address`獲取 Cython 擴展模塊中 C 函數的地址。該地址可用于通過 [`ctypes.CFUNCTYPE()`](https://docs.python.org/3/library/ctypes.html#ctypes.CFUNCTYPE "(in Python v3.7)") 回調訪問 C 函數,從而允許在 Numba jitted 函數中使用 C 函數。例如,假設您有文件`foo.pyx`:
```py
from libc.math cimport exp
cdef api double myexp(double x):
return exp(x)
```
您可以通過以下方式從 Numba 訪問`myexp`:
```py
import ctypes
from numba.extending import get_cython_function_address
addr = get_cython_function_address("foo", "myexp")
functype = ctypes.CFUNCTYPE(ctypes.c_double, ctypes.c_double)
myexp = functype(addr)
```
函數`myexp`現在可以在 jitted 函數中使用,例如:
```py
@njit
def double_myexp(x):
return 2*myexp(x)
```
需要注意的是,如果您的函數使用 Cython 的融合類型,那么函數的名稱將被破壞。要找出函數的錯位名稱,可以檢查擴展模塊的`__pyx_capi__`屬性。
- 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. 術語表