Python numba jitclass-属性a.x为a.x返回False
尝试检查两个jitclass实例属性的标识时,我发现与普通python类相比,这种行为很奇怪。Numba jitclass在其自身的实例属性标识检查中返回False,其中普通python类按预期工作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
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属性不存储对象,只存储数据。这真是一个很好的答案!很高兴它是有用的:)这真是一个很好的答案!很高兴它有用:)