我想将一个类对象传递给一个函数。 我可以使它工作,但我想知道是否有一种类型我可以分配它? 我有一个“最小”的例子,说明我要做的事情。
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来告诉它是我传递的类对象。
答案 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编译代码之间传递它们的开销非常大,所以请记住这一点。