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