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)
尽管搜索了 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)