尽管搜索了 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)
关于python - Numba 签名协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087812/