numba jitclass - 属性 a.x 是 a.x returns False
numba jitclass - attribute a.x is a.x returns False
试图检查两个 jitclass 实例属性的身份,与普通 python 类 相比,我发现了这种奇怪的行为。 Numba jitclass return 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:
The data of a jitclass instance is allocated on the heap as a C-compatible structure so that any compiled functions can have direct access to the underlying data, bypassing the interpreter.
这意味着class(在本例中为x
)的数据不能被Python解释器直接访问。但是,解决此问题的透明解决方案是使用 properties。 Numba 似乎采用了这种方法。
每次您访问 b.x
时,都会在后台调用一个函数,该函数 return 是一个包装 x
值的 Python 对象。 class不存储对象,所以每次访问x
returns一个新对象。通过调用 id(b.x)
验证这一点 - 它每次都会 return 不同的 ID。
我们可以模拟 jit class 的行为:
class MyClass(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return float(self._x)
And how I should check whether two jitclass attributes reference to the same object?
好吧,他们没有。 jitclass 属性不存储对象,只存储数据。
试图检查两个 jitclass 实例属性的身份,与普通 python 类 相比,我发现了这种奇怪的行为。 Numba jitclass return 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:
The data of a jitclass instance is allocated on the heap as a C-compatible structure so that any compiled functions can have direct access to the underlying data, bypassing the interpreter.
这意味着class(在本例中为x
)的数据不能被Python解释器直接访问。但是,解决此问题的透明解决方案是使用 properties。 Numba 似乎采用了这种方法。
每次您访问 b.x
时,都会在后台调用一个函数,该函数 return 是一个包装 x
值的 Python 对象。 class不存储对象,所以每次访问x
returns一个新对象。通过调用 id(b.x)
验证这一点 - 它每次都会 return 不同的 ID。
我们可以模拟 jit class 的行为:
class MyClass(object):
def __init__(self, x):
self._x = x
@property
def x(self):
return float(self._x)
And how I should check whether two jitclass attributes reference to the same object?
好吧,他们没有。 jitclass 属性不存储对象,只存储数据。