python - Numba 签名协议(protocol)

标签 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 如何足够深入地工作以预测我应该如何表达签名?

最佳答案

对于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/

相关文章:

python 3 : Good location(s) to install own and 3rd party packages?

python - 使用图像模块(python)将希伯来语文本绘制到图像

java - 为什么 Java 中的包装器类的行为不像引用类型?

sql - 仅在列中选择类型 int?

ios - 强制模板成为协议(protocol)

Electron 实例通信

python:在父类的方法中,调用该类的类方法,但绑定(bind)到子类

python - 当我传递特定参数时,使用 ElementTree 的 iter() 解析 XML 没有找到我的标签

Haskell 类型转换问题

c - 如何解析 MDNS 响应?