将 class 对象作为函数参数传递,在 Numba 中优化 Python

Passing a class object as a function argument, in Numba optimized Python

我想将 class 对象传递给函数。 我可以让它工作,但我想知道是否有一种类型可以分配给它? 我有一个 "minimal" 例子来说明我正在尝试做什么。

spec = [("a", float64),("b",float64)]
@jitclass(spec)
class SOMETHING_3():
    def __init__(self):
        self.a = 1.1
        self.b = 2.3

    def sum(self):
        return self.a + self.b


@jit(float64(float64, XXX), nopython = True)
def get_sum_3(c, someobj):
    d = 0
    for i in range(1000):
        for j in range(1000):
            d += c + someobj.sum()
    return d   

如果我删除显式类型分配 "float64(float64, XXX)" 它工作正常。

但是有什么东西可以代替 XXX 来表明它是我传递的 class 对象。

如果您将 XXX 替换为 SOMETHING_3.class_type.instance_type,您提供的代码应该可以使用。

值得注意的是,如果您改为尝试接收一组 jitclass 对象,这将变得更加棘手(我相信目前不可能)。如果您的完整 problem/code 涉及这些 jitclass 对象的数组,我建议您考虑使用 NumPy 结构化数组而不是 jitclass。这主要是因为当前版本的 Numba 似乎不支持使用 jitclass 对象数组作为函数参数。这样做的原因是 jitclass 对象数组将被解释为 dtype 为 numpy.object 的 NumPy 数组,这在 Numba 的 nopython 模式中不受支持。由于它是 Numba 无法降低的类型(编译以在 nopython 模式下使用),因此 nopython 模式对于延迟编译(无函数签名)和急切编译(指定函数签名)都会失败。

更新:

现在支持 jitclass 对象列表,但是在 Python 和 nopython 编译代码之间传递它们的开销非常大(在编写本文时),所以请记住这一点。