我想将一个类对象传递给一个函数。
我可以让它工作,但我想知道是否有一种类型可以分配它?
我有一个“最小”的例子来说明我正在尝试做的事情。
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 来告诉它是我传递的类对象吗?
如果你更换了XXX
with SOMETHING_3.class_type.instance_type
您给出的代码应该可以工作。
值得注意的是,如果您尝试接受 jitclass 对象数组,那么这会变得更加棘手(我相信目前这是不可能的)。如果您的完整问题/代码涉及这些 jitclass 对象的数组,我建议您考虑使用 NumPy 结构化数组而不是 jitclass 来执行此操作。这主要是因为当前版本的 Numba 似乎不支持使用 jitclass 对象数组作为函数参数。原因是 jitclass 对象的数组将被解释为 dtype 为的 NumPy 数组numpy.object
,这不是 Numba 的 nopython 模式中受支持的数据类型。由于它是 Numba 无法降低的类型(编译以在 nopython 模式下使用),因此 nopython 模式对于惰性编译(无函数签名)和急切编译(指定函数签名)都将失败。
UPDATE:
现在支持 jitclass 对象列表,但是在 Python 和 nopython 编译代码之间传递它们会产生很大的开销(截至编写本文时),因此请记住这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)