尝试检查两个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 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属性不存储对象,仅存储数据。

关于python - numba jitclass-属性a.x是a.x返回False,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47528207/

10-11 00:24