# 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. 术语表