2017-07-10 13 views
1

をJITコンパイルされた私のコードは次のようになります。は、だからここに機能

@jit(nopython=True) 
def sum_fn(arg1, arg2, ...argn): 
    ..... 
    for i in xrange(len(arg2)): #For each bin 
     l, p = fn1(arg1, arg2...argn) 
     res = res + fn2(arg1, arg2, arg3) 
    return res 

@jit(nopython=True) 
def fn1(a1, a2,...an): 
    .... 
    return r1, r2 

def fn2(l_lk, l_pk, l_lvals): 
     f_i = interp1d(l_lk, l_pk,kind='linear') #Scipy.interpolate.interp1d 
     ftmp = fn3(f_i,l_lk,l_pk) 
     return 10**ftmp(l_lvals) 

それはnumbaコンパイルプロセスにインポートされていないので、FN2を呼び出すと、エラーを与えることが表示されますfn1とは異なり、これはジッタされる。残念ながら、Numbaで認識されないscipy.interpolate.interp1d関数を使用しているため、fn2をjitできません。これを回避するにはどうしたらいいですか?

答えて

0

ジッチされていない関数をnopython=Trueという関数で呼び出すことはできません。前者は定義上はPython関数です。唯一の実際の選択肢は、interp1dの独自のバージョンをジット関数として書くことです(やはりnopython=True)。オリジナルのscipyまたはnumpy関数のソースを調べることで、必要な機能を取り除くのが簡単な場合もあります。残念ながら時にはそれはかなり困難です。

次のライブラリは役に立つかもしれません:

https://github.com/EconForge/interpolation.py

+0

私は線形補間を自分で書いてみてくださいし、それにnumbaを使用しました。しかし、少なくとも試行データでは、scipyインターポレータは、私が書き込んだ線形補間器+ numbaよりも大幅に高速に動作しました。これは可能性がありますか、これは私が補間子コードを非常に非効率的に書いたことを意味しますか?図書館をありがとう、私はそれを見てみましょう。 – Neodymia

+0

あなたの線形補間スキームが、それを見なくてもscipyのものよりも効率的でない理由は言うまでもありませんが、私が推測する性能はかなり類似しているものを得ることが可能でなければなりません。 – JoshAdel