Python numba jitclass-属性a.x为a.x返回False

Python numba jitclass-属性a.x为a.x返回False,python,identity,jit,numba,Python,Identity,Jit,Numba,尝试检查两个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 MyJitClas

尝试检查两个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实例的数据在堆上作为C兼容结构分配,因此任何编译后的函数都可以绕过解释器直接访问底层数据

这意味着Python解释器不能直接访问类的数据(
x
)。然而,解决这个问题的透明解决方案是使用。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属性不存储对象,只存储数据。

让我从引用以下内容开始:

jitclass实例的数据在堆上作为C兼容结构分配,因此任何编译后的函数都可以绕过解释器直接访问底层数据

这意味着Python解释器不能直接访问类的数据(
x
)。然而,解决这个问题的透明解决方案是使用。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属性不存储对象,只存储数据。

这真是一个很好的答案!很高兴它是有用的:)这真是一个很好的答案!很高兴它有用:)