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

Eri*_*ren 3 numba

我想将一个类对象传递给一个函数。我可以让它工作,但我想知道是否有我可以分配的类型?我有一个我正在尝试做的“最小”示例。

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   
Run Code Online (Sandbox Code Playgroud)

如果我删除显式类型赋值“float64(float64, XXX)”,它工作正常。

但是有什么我可以用 XXX 替换它来告诉它是我正在传递的类对象。

Sam*_*usa 7

如果你用 SOMETHING_3.class_type.instance_type 替换了 XXX,你给出的代码应该可以工作。

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

更新:

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