使用入口点注册扩展
通常,第三方包会有面向用户的API,并且定义了对Numba编译器的扩展。在这些情况下,当用户导入包时,新的类型和重载可以注册到Numba中。然而,有些情况下,Numba扩展通常不会被用户直接导入,但仍需注册到Numba编译器中。一个例子是 numba-scipy 包,它为Numba添加了对一些SciPy函数的支持。最终用户不需要 import numba_scipy
来启用对SciPy的编译器支持,只需在Python环境中安装该扩展即可。
Numba 使用 setuptools
的 入口点 功能来发现扩展。这允许一个 Python 包注册一个初始化函数,该函数将在 numba
首次编译之前被调用。这种延迟确保了导入扩展的成本被推迟到必要时才发生。
添加对“Init”入口点的支持
一个包可以通过在 setup.py
中的 setup()
函数调用中添加 entry_points
参数来向 Numba 注册一个初始化函数:
setup(
...,
entry_points={
"numba_extensions": [
"init = numba_scipy:_init_extension",
],
},
...
)
Numba 目前仅在 numba_extensions
组中查找 init
入口点。入口点应为一个函数(任何名称,只要与 setup.py
中列出的名称匹配),该函数不接受任何参数,并且返回值被忽略。此函数应注册类型、重载或调用其他 Numba 扩展 API。扩展的初始化顺序未定义。
测试你的入口点
Numba 在编译第一个函数时加载所有入口点。要测试你的入口点,仅仅 import numba
是不够的;你必须定义并运行一个小函数,如下所示:
import numba; numba.njit(lambda x: x + 1)(123)
不需要导入你的模块:入口点是通过你库的 *.egg-info
目录中的 entry_points.txt
文件来识别的。
setup.py build
命令不会创建 eggs,但 setup.py sdist``(用于在本地目录中测试)和 ``setup.py install
会。所有在 Python 路径上的 eggs 中注册的入口点都会被加载。调试时务必检查是否存在过时的 entry_points.txt
。