`@numba.jitclass`的特殊方法在哪里?

时间:2017-05-29 12:34:00

标签: python numba

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)

1 个答案:

答案 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>