2017-08-28 2 views
1

versucht herauszufinden, wie eine Klassenmethode während der Verwendung von JITClass zu überspringen.Numba, Jitclass w/nopython Modus und Wörterbücher

haben ein ziemlich großes rekursive Modell (so ziemlich eine massive for-Schleife), die - pfadabhängigen Berechnungen gegeben, kann nicht mit geraden Numpy vektorisiert werden.

Die Klasse läuft durch eine Reihe von numpy Arrays mit dem allgemein numba freundlicher Syntax aber ich habe einen Abschnitt, der einige der Verfahren, die in einer geordneten Art und Weise ruft:

def operations(self, i, ops_order_config): 

    ops_dict = self.ops_dict 

    for index in range(len(waterfall_config)): 
     try: 
      if isinstance(ops_config[index], tuple): 
       ops_dict[ops_config[index][0]](i, ops_config[index][1]) 
      else: 
       ops_dict[ops_config[index]](i) 
     except KeyError: 
      pass 

Dieser Teil des Modells ist ziemlich entscheidend für die Flexibilität - die "Config" ist eine geordnete Liste von Tupeln, die die geeignete Methode zum Aufruf enthalten, und die entsprechenden Parameter. Das ops_dict enthält das eigentliche Selbst. Das wird von der Konfig mit den richtigen Parametern aufgerufen.

Wenn ich ein jitclass machen, ist es eine Möglichkeit, jitting dieses Wörterbuch Aspekt nur überspringen?

Antwort

0

Nein, wenn Sie ein jitclass machen, muss jedes Attribut eingegeben werden und Wörterbücher oder Listen/Tupel, die Funktionen enthalten (auch wenn Jitted), werden ab 0.34 nicht unterstützt. Zum Beispiel versuchen dict oder object als Typ zu verwenden:

import numpy as np 
from numba import jitclass 

spec = [('dct', dict)] 

@jitclass(spec) 
class ClsWithObject(object): 
    def __init__(self, value): 
     self.dct = {} 

Wirft ein TypeError:

TypeError: spec values should be Numba type instances, got <class 'dict'>

Außerdem mit isinstance sowie try und except funktionieren nicht in nopython-Modus auch nicht.

Ihre beste Möglichkeit wäre, eine jit ted Funktion zu verwenden, die aus einer reinen Python-Klasse genannt wird.

+0

Vielen Dank. Wenn jitclass verwendet wird und funktioniert, ist es eine sichere Annahme, dass der nopython-Modus angewendet wird? – user7038639

+0

@ user7038639 Ja. Alle Methoden der Klasse werden im nopython-Modus kompiliert. Die [docs] (http://numba.pydata.org/numba-doc/dev/user/jitclass.html) erwähnen dies ausdrücklich: "Alle Methoden einer JITCLASS werden in NOPHONDON-Funktionen kompiliert. Die Daten einer JITCLASS-Instanz sind auf dem Heap als C-kompatible Struktur zugewiesen, so dass kompilierte Funktionen direkten Zugriff auf die zugrunde liegenden Daten haben und den Interpreter umgehen können. " :) – MSeifert

+0

Blah, war zehnmal durch diese Dokumente gegangen und schien das verpasst zu haben. Vielen Dank! – user7038639

0

Im Hinblick auf die Verwendung von Wörterbücher in Numba kompilierten Funktionen, wie MSeifert sagte, hat Numba dies nicht unterstützen. In meiner eigenen Arbeit bin ich auf dieses Problem gestoßen und habe eine Implementierung (nicht von mir) von Wörterbüchern in Numba gefunden, die großartig funktioniert hat, es ist das GitHub-Repository, das man finden kann here.