尝试检查两个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属性是否引用同一对象?
最佳答案
让我首先引用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属性不存储对象,仅存储数据。
关于python - numba jitclass-属性a.x是a.x返回False,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47528207/