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

问题描述 投票:2回答:1

我想将一个类对象传递给一个函数。我可以使它工作,但我想知道是否有一种类型我可以分配它?我有一个“最小”的例子,说明我要做的事情。

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来告诉它是我传递的类对象。

numba
1个回答
4
投票

如果您使用SOMETHING_3.class_type.instance_type替换了XXX,则您提供的代码应该可以正常工作。

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

更新:

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

© www.soinside.com 2019 - 2024. All rights reserved.