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不存储对象,所以每次访问xreturns一个新对象。通过调用 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 属性不存储对象,只存储数据。