【问题标题】:numba jitclass - attribute a.x is a.x returns Falsenumba jitclass - 属性 a.x 是 a.x 返回 False
【发布时间】:2017-11-28 18:03:44
【问题描述】:

试图检查两个 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 属性是否引用同一个对象?

【问题讨论】:

    标签: python identity jit numba


    【解决方案1】:

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

    【讨论】:

    • 这真是一个很好的答案!
    • 很高兴它很有用:)
    猜你喜欢
    • 2013-02-04
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多