Numba 签名协议

Numba signatures protocol

尽管搜索了 Stack Overflow 和整个互联网,并阅读了几个 Stack Overflow 问题和 numba.pydata.org 页面,并了解了一些线索,以了解如何告诉 Numba 我想提供和获取的类型功能,我没有找到它如何工作的实际逻辑。

例如,我试验了一个处理整数列表并输出另一个整数列表的函数,当装饰器 @numba.jit(numba.int64[:](numba.int64[:])) 工作时,装饰器 @numba.njit(numba.int64[:](numba.int64[:]))@numba.vectorize(numba.int64[:](numba.int64[:])) 不工作。

(njit 成功地通过了装饰器并偶然发现了函数本身;我猜测将元素连接到列表在 'no python' 模式下不是可用的函数。vectorize,然而,抱怨签名,TypeError: 'Signature' object is not iterable;也许它担心一维数组可能包含一个没有括号的元素,这不是可迭代的?)

是否有一种简单的方法可以深入了解 Numba 的工作原理以预测我应该如何表达签名?

jit(和 njit 只是 nopython=True 的别名)的最简单答案是尽量避免完全编写签名 - 在常见情况下,类型推断会得到你在。

针对您的问题 numba.int64[:](numba.int64[:]) 是一个有效的签名并且适用于 jit

numba.vectorize- 需要一个可迭代的签名(错误消息),因此您的签名需要包含在一个列表中。此外,vectorize 创建了一个 numpy ufunc,它由标量操作(然后广播)定义,因此您的签名必须是标量类型。例如

@numba.vectorize([numba.int64(numba.int64)])
def add_one(v):
    return v + 1

add_one(np.array([4, 5, 6], dtype=np.int64))
# Out[117]: array([5, 6, 7], dtype=int64)