2017-05-29 5 views
0

TL; DR: Beim Dekorieren einer Klasse mit @numba.jitclass erscheinen spezielle Methoden wie __add__ nicht in Instanzen der Klasse, während andere Methoden normal funktionieren. Warum passiert das?Wohin gehen `@numba.jitclass`ed spezielle Methoden?

Betrachten Sie die folgende Klassendeklaration:

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) 

Ohne die Dekorateur die Klasse perfekt funktioniert gut. Aufgrund der __add__ Methode sind Ausdrücke wie xy(1, 2) + xy(3, 4) möglich und liefern erwartete Ergebnisse. Doch mit dem Dekorateur bekomme ich folgende Fehlermeldung:

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

Es ist wie die __add__ Methode aussieht, ist nicht in xy Objekte:

>>> xy(1, 2).__add__ # AttributeError: 'xy' object has no attribute '__add__' 

Aber die Methode ist in der Klasse:

Was macht Numba bei der Instanziierung mit der Methode __add__? Gibt es eine andere Möglichkeit, Operatoren für Jitted-Klassen zu aktivieren, so dass ich xy(1, 2) + xy(3, 4) schreiben kann?

Antwort

1

Derzeit (Stand numba Version 0.33) Betreiber auf jitclasses Überlastung wird nicht unterstützt, offene Frage hier: https://github.com/numba/numba/issues/1606#issuecomment-284552746

Ich weiß nicht, die genaue Interna, aber es ist wahrscheinlich die Methode einfach verworfen wird. Beachten Sie, dass Sie bei der Instanziierung um jitclass nicht direkt die Python-Klasse instanziieren, sondern stattdessen einen Wrapper für den Low-Level-Typ "Numba" erhalten.

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> 
+0

Aww, schade. Zumindest muss ich nicht updaten :) – kazemakase

Verwandte Themen