2017-01-23 3 views
3

Was ist derzeit der beste Weg, mit Funktionen höherer Ordnung in Numba umzugehen?Funktionstypen in numba

Ich setzte die secant method:

def secant_method_curried (f): 
    def inner (x_minus1, x_0, consecutive_tolerance): 
     x_new = x_0 
     x_old = x_minus1 
     x_oldest = None 
     while abs(x_new - x_old) > consecutive_tolerance: 
      x_oldest = x_old 
      x_old = x_new 
      x_new = x_old - f(x_old)*((x_old-x_oldest)/(f(x_old)-f(x_oldest))) 
     return x_new 
    return numba.jit(nopython=False)(inner) 

Das Problem ist, dass es keine Möglichkeit numba dass f zu sagen ist doube(double) ist, so dass die oben genannten Code bricht mit nopython=True:

TypingError: Failed at nopython (nopython frontend) 
Untyped global name 'f' 

Es ist wie es scheint war ein FunctionType in früheren Versionen, wurde aber entfernt/umbenannt: http://numba.pydata.org/numba-doc/0.8/types.html#functions

On this page, erwähnen sie etwas namens numba.addressof(), das irgendwie hilfreich scheint, aber wieder 4 Jahre zurückgeht.

+0

Könnten Sie angeben, was 'f' ist (und der Code die Ausnahme erzeugt) und die vollständige Rückverfolgung? – MSeifert

Antwort

3

Nach ein wenig Experimentieren konnte ich Ihren Fehler reproduzieren. Im Fall war es genug, um jit die Funktion, um Ihren secant_method_curried geben:

>>> from numba import njit 

>>> def func(x): # an example function 
...  return x 

>>> p = secant_method_curried(njit(func)) # jitted the function 

>>> p(1,2,3) 
2.0 

Sie können auch die Unterschrift erklären, wenn Sie in dem njit(func) oder jit(func) passieren.


Es gibt auch ein gutes Beispiel für Verschlüsse mit numba im documentation und es wird auch erwähnt, dass:

[...] Sie sollten diese Funktion JIT-kompilieren, wenn es aus aufgerufen wird eine andere Jitted-Funktion.