代码之家  ›  专栏  ›  技术社区  ›  nivniv

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

  •  1
  • nivniv  · 技术社区  · 7 年前

    试图检查两个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 回复  |  直到 7 年前
        1
  •  6
  •   MB-F    7 年前

    让我从引用 jitclass documentation :

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

    这意味着类的数据( x 在这种情况下),Python解释器无法直接访问。然而,解决这个问题的透明解决方案是使用 properties . 麻木似乎采取了这种方法。

    每次你访问 b.x ,在后台调用一个函数,该函数返回一个包含 x . 该类不存储对象,因此每个访问 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属性不存储对象,只存储数据。