【发布时间】:2019-12-10 23:08:59
【问题描述】:
我正在尝试创建一个类,它可能是 jitclass 的一部分,但有一些属性是它们自己的 jitclass 对象。
例如,如果我有两个带有装饰器 @jitclass 的类,我希望将它们实例化为第三个类 (combined)。
import numpy as np
from numba import jitclass
from numba import boolean, int32, float64,uint8
spec = [
('type' ,int32),
('val' ,float64[:]),
('result',float64)]
@jitclass(spec)
class First:
def __init__(self):
self.type = 1
self.val = np.ones(100)
self.result = 0.
def sum(self):
self.result = np.sum(self.val)
@jitclass(spec)
class Second:
def __init__(self):
self.type = 2
self.val = np.ones(100)
self.result = 0.
def sum(self):
self.result = np.sum(self.val)
@jitclass(spec)
class Combined:
def __init__(self):
self.List = []
for i in range(10):
self.List.append(First())
self.List.append(Second())
def sum(self):
for i, c in enumerate(self.List):
c.sum()
def getresult(self):
result = []
for i, c in enumerate(self.List):
result.append(c.result)
return result
C = Combined()
C.sum()
result = C.getresult()
print(result)
在该示例中,我收到一个错误,因为 numba 无法确定 self.List 的类型,它是两个 jitclass 的组合。
如何使Combined 类与jitclass 兼容?
更新
它尝试了我在其他地方找到的东西:
import numpy as np
from numba import jitclass, deferred_type
from numba import boolean, int32, float64,uint8
from numba.typed import List
spec = [
('type' ,int32),
('val' ,float64[:]),
('result',float64)]
@jitclass(spec)
class First:
def __init__(self):
self.type = 1
self.val = np.ones(100)
self.result = 0.
def sum(self):
self.result = np.sum(self.val)
spec1 = [('ListA', List(First.class_type.instance_type, reflected=True))]
@jitclass(spec1)
class Combined:
def __init__(self):
self.ListA = [First(),First()]
def sum(self):
for i, c in enumerate(self.ListA):
c.sum()
def getresult(self):
result = []
for i, c in enumerate(self.ListA):
result.append(c.result)
return result
C = Combined()
C.sum()
result = C.getresult()
print(result)
但我得到了这个错误
List(First.class_type.instance_type)
TypeError: __init__() takes 1 positional argument but 2 were given
【问题讨论】:
-
你检查答案here了吗?这不是您需要的 100%,但它可能会有所帮助 - 它提供了一些示例。
-
如果我只实例化一次类 First,这个解决方案就可以工作,但我想要一个列表。我更新了我的帖子。