2017-01-23 8 views
3

В настоящее время лучший способ иметь дело с функциями более высокого порядка в numba?Типы функций в numba

Я реализован 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) 

Вопрос заключается в том, что нет никакого способа сказать Numba, что f является doube(double), поэтому приведенный выше код порывает с nopython=True:

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

Похоже, что был функциональным типом в предыдущих версиях, но был удален/переименован: http://numba.pydata.org/numba-doc/0.8/types.html#functions

On this page, они упоминают что-то, называемое numba.addressof(), которое кажется полезным, но снова датируется 4 годами.

+0

Не могли бы вы включить, что 'f' (и код создает исключение) и полную трассировку? – MSeifert

ответ

3

После нескольких экспериментов я смог воспроизвести вашу ошибку. В случае этого было достаточно, чтобы jit функция перешла к вашей secant_method_curried:

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

Вы можете также объявить подпись, когда вы проходите в njit(func) или jit(func).


Существует также хороший пример затворов Numba в documentation и он также отметил, что:

[...] вы должны JIT-компиляцию этой функции, если она вызывается из другая функция.