使用入口点注册扩展

通常,第三方包会有面向用户的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