numba jitclass - 属性a.x是a.x返回False

时间:2017-11-28 09:38:46

标签: 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 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属性是否引用同一个对象?

1 个答案:

答案 0 :(得分:4)

首先让我引用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属性不存储对象,只存储数据。