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

时间:2018-03-04 17:33:08

标签: 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   

如果我删除了explict类型的分配“float64(float64,XXX)”,它可以正常工作。

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

1 个答案:

答案 0 :(得分: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编译代码之间传递它们的开销非常大,所以请记住这一点。