2017-10-18 2 views
1

Verwenden numba.jit in Python.Wie benutze ich numba.jit mit Methoden

kann ich normale Funktionen jit-Typen konvertieren und ausführen:

from numba import jit 

def sum(a, b): 
    return a+b 

func = jit(sum) 
print(func(1, 2)) 

Wie diese Methoden zu tun? So etwas (das funktioniert nicht und ich weiß warum).

from numba import jit 

class some_class: 
    def __init__(self, something = 0): 
     self.number = something 
    def get_num(self): 
     return self.number 

my_object = some_class(5) 
func = jit(my_object.get_num) 
print(my_object.func()) 

P.S. Ich habe auch Dekoratoren ausprobiert, es funktioniert, aber ich kann es nicht für importierte Klassen verwenden (die, die ich selbst nicht definiere), also schaue ich mir das an.

Antwort

0

Sie können nicht JIT Methoden gebunden, aber Sie können nicht gebundene Methoden JIT (aber nur in Objekt-Modus):

from numba import jit 

class some_class: 
    def __init__(self, something = 0): 
     self.number = something 
    def get_num(self): 
     return self.number 
    func = jit(get_num) 

my_object = some_class(5) 
print(my_object.func()) 
# 5 

Beachten Sie, dass dies nicht nopython Modus nicht verwendet, so sollten Sie nicht erwarten irgendwelche vernünftigen Beschleunigungen. Man könnte die Klasse macht sich ein jitclass (das bedeutet, dass alle Methoden nopython-jitted automatisch), aber es erfordert, dass Sie die Attribute eingeben:

import numba as nb 

spec = [ 
    ('number', nb.int64), 
] 

@nb.jitclass(spec) 
class some_class: 
    def __init__(self, something): 
     self.number = something 
    def get_num(self): 
     return self.number 

my_object = some_class(5) 
print(my_object.get_num()) 

Aber für kompliziertere Klassen wird es sehr schwer werden (oder unmöglich) zu Verwenden Sie jitclass. Nach meiner Erfahrung ist der beste Weg, um die jitted Funktionen innerhalb der Methode rufen Sie einfach an:

from numba import njit # like jit but enforces nopython-mode! 

@njit 
def my_func(val): 
    return val # this example is a bit stupid, I hope your real code does more! 

class some_class: 
    def __init__(self, something = 0): 
     self.number = something 
    def get_num(self): 
     return my_func(self.number) 

my_object = some_class(5) 
print(my_object.get_num()) 

Es hängt davon ab, wie komplex Ihre Klasse und/oder Ihre Methode ist, welcher Ansatz verwendet werden soll. In Ihrem Fall würde ich numba überhaupt nicht benutzen, weil es einfach nicht genug rechenintensive Sachen gibt, die den Numba und Jit Overhead kompensieren würden. Wenn es etwas komplizierter wäre, würde ich jitclass verwenden, und wenn es viel komplizierter wäre, würde ich die jitted-Funktion verwenden, die aus dem Funktionsansatz heraus aufgerufen wird. Persönlich würde ich nie jit für eine Methode verwenden, da dies implizit Objekt-Modus erfordert, so ist es wahrscheinlich, dass die Jitted-Funktion langsamer ist als die Unjitted-Funktion.

Durch die Art und Weise: In Python Sie in der Regel property anstelle von get_* oder set_* Funktionen ...