Numba签名协议

时间:2018-06-28 16:40:01

标签: python types protocols signature numba

尽管搜索了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的工作原理,以至于可以预见我应该如何表达签名?

1 个答案:

答案 0 :(得分:1)

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)