TL; DR:当使用@numba.jitclass
等特殊方法(例如__add__
)装饰类时,不会出现在类的实例中,而其他方法正常工作。为什么会这样?
考虑以下类声明:
import numba as nb
dual_spec = [('x', nb.float64), ('y', nb.float64)]
@nb.jitclass(dual_spec)
class xy:
def __init__(self, x, y):
self.x = x
self.y = y
def addition(self, other):
return xy(self.x + other.x, self.y + other.y)
def __add__(self, other):
return xy(self.x + other.x, self.y + other.y)
没有装饰者,这个班级完美无缺。由于__add__
方法可以使用xy(1, 2) + xy(3, 4)
这样的表达式并返回预期结果。但是,使用装饰器我收到以下错误消息:
>>> xy(1, 2) + xy(3, 4) # TypeError: unsupported operand type(s) for +: 'xy' and 'xy'
>>> xy(1, 2).addition(xy(3, 4)) # But this works nicely
__add__
个对象中似乎没有xy
方法:
>>> xy(1, 2).__add__ # AttributeError: 'xy' object has no attribute '__add__'
但该方法存在于课堂上:
>>> xy.__add__ # <function __main__.xy.__add__>
numba在实例化期间对__add__
方法做了什么?是否有其他方法可以为jitted类启用运算符,以便我可以编写xy(1, 2) + xy(3, 4)
?
答案 0 :(得分:1)
目前(从numba版本0.33
开始)不支持jitclasses上的运算符重载,这里打开问题:
https://github.com/numba/numba/issues/1606#issuecomment-284552746
我不知道确切的内部结构,但很可能这种方法被丢弃了。请注意,当您在jitclass
实例化时,您不是直接实例化python类,而是获取低级numba类型的包装器。
v = xy(1, 2)
v
Out[8]: <numba.jitclass.boxing.xy at 0x2e700274950>
v._numba_type_
Out[9]: instance.jitclass.xy#2e77d394438<x:float64,y:float64>