Python Numba签名协议

Python Numba签名协议,python,types,protocols,signature,numba,Python,Types,Protocols,Signature,Numba,尽管搜索了Stack Overflow和整个internet,阅读了几个Stack Overflow问题和页面,并学习了一些关于如何告诉Numba我想从函数中获得什么类型的线索,但我没有找到它工作的实际逻辑 例如,我试验了一个处理整数列表并输出另一个整数列表的函数,当修饰符@numba.jit(numba.int64[:](numba.int64[:])工作时,修饰符@numba.njit(numba.int64[:](numba.int64[:])和@numba.vectorize(numba

尽管搜索了Stack Overflow和整个internet,阅读了几个Stack Overflow问题和页面,并学习了一些关于如何告诉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'对象不可iterable
;可能是担心的一个1D数组可以包含一个没有括号的元素,这不是一个iterable吗?)


有没有一种简单的方法可以理解Numba是如何工作到足够的深度来预测我应该如何表达签名的?

jit的最简单答案(以及
njit
,它只是
nopython=True
的别名)就是尽量避免写签名——在一般情况下,类型推断会让你达到目的

特定于您的问题
numba.int64[:](numba.int64[:])
是有效的签名,适用于
jit

numba.vectorize
-需要一个iterable签名(错误消息),因此您的签名需要包装在一个列表中。另外,
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)

啊,所以它不是要一个伊特拉布的签名,而是一个伊特拉布的签名!