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) 

問題はそのf numba伝える方法がないということですdoube(double)ので、nopython=Trueと、上記のコードブレーク:それはのようにあるようです

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

以前のバージョンのFunctionTypeでしたが、削除/名前が変更されました:http://numba.pydata.org/numba-doc/0.8/types.html#functions

On this pageには、numba.addressof()というものがありますが、これは役に立つと思われますが、4年前の日付です。

+0

'f'が(コードが例外を生成する)と完全なトレースバックを含めることができますか? – MSeifert

答えて

3

少しの実験の後、私はあなたのエラーを再現することができました。あなたがnjit(func)またはjit(func)に渡すとき

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

あなたはまた、署名を宣言することができます場合、それはあなたのsecant_method_curriedに渡された関数はjitに十分でした。


ありnumbaとクロージャの良い例はdocumentationでもあり、それはまた、と述べられている:あなたはJITでコンパイルする必要があり、その機能を、それがから呼び出された場合、[...]

もう一つの機能。