试图检查两个jitclass实例属性的身份,我发现这种奇怪的行为与普通的python类相比。 Numba jitclass在其自己的实例属性标识检查中返回False,其中普通的python类按预期工作。
import numba
class MyClass(object):
def __init__(self, x):
self.x = x
spec = [('x', numba.double)]
@numba.jitclass(spec)
class MyJitClass(object):
def __init__(self, x):
self.x = x
a = MyClass(1)
b = MyJitClass(1)
现在检查身份:
>>> a.x is a.x
True
>>> b.x is b.x
False
知道为什么会这样吗?我应该如何检查两个jitclass属性是否引用同一个对象?
答案 0 :(得分:4)
首先让我引用jitclass
documentation:
jitclass实例的数据作为C兼容结构在堆上分配,这样任何编译的函数都可以绕过解释器直接访问底层数据。
这意味着Python解释器无法直接访问类的数据(本例中为x
)。但是,解决此问题的透明解决方案是使用properties。 Numba似乎采取了这种方法。
每次访问b.x
时,都会调用一个函数来返回一个包含值x
的Python对象。该类不存储该对象,因此每次访问x
都会返回一个新对象。通过调用id(b.x)
来验证这一点 - 它每次都会返回一个不同的ID。
我们可以使用以下方法模拟jit类的行为:
class MyClass(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return float(self._x)
我应该如何检查两个jitclass属性是否引用同一个对象?
嗯,他们不是。 jitclass属性不存储对象,只存储数据。