niv*_*niv 1 python jit identity 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)
Run Code Online (Sandbox Code Playgroud)
现在检查身份:
>>> a.x is a.x
True
>>> b.x is b.x
False
Run Code Online (Sandbox Code Playgroud)
知道为什么会这样吗?我应该如何检查两个 jitclass 属性是否引用了同一个对象?
让我从引用jitclass文档开始:
jitclass 实例的数据作为 C 兼容结构在堆上分配,以便任何编译的函数都可以直接访问底层数据,绕过解释器。
这意味着xPython 解释器不能直接访问类的数据(在本例中)。但是,解决此问题的透明解决方案是使用properties。Numba 似乎采用了这种方法。
每次访问时b.x,都会在后台调用一个函数,该函数返回一个包含 值的 Python 对象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)
Run Code Online (Sandbox Code Playgroud)
我应该如何检查两个 jitclass 属性是否引用了同一个对象?
好吧,他们没有。jitclass 属性不存储对象,只存储数据。
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |