2017-03-25 17 views
4

他のjitted関数を呼び出すNumba-jitted関数がこれを認識し、Pythonオブジェクト層を経由するのではなく、高速のC呼び出し規約を自動的に使用することを知っています。オーバーヘッド:NumbaコードからCython関数を呼び出す

import numba 

@numba.jit 
def foo(x): 
    return x**2 

@numba.jit 
def bar(x): 
    return 4 * foo(x) # this will be a fast function call 

私がNumbaからCython関数を呼び出した場合、同じことが当てはまるかどうかです。

cpdef double foo(double x): 
    return x**2 

と同様に、標準のPythonモジュールbar.py:それでは、私はCythonモジュール、foo.pyxを持っているとしましょう

import numba 
import foo 

@numba.jit 
def bar(x): 
    return 4 * foo.foo(x) # will this be a fast function call? 

ウィルNumbaは自動的にC-呼び出し可能な関数としてfoo.fooを認識したり、私はする必要がありますかCFFIラッパーを手動で設定してください。

EDIT:さらに詳しく述べると、Cython関数は、Pythonインタプリタの視点から見ると、標準の「組み込み」関数です。そのため、より一般的な質問をすることができます:Numbaは、Python呼び出しオーバーヘッドをバイパスするための組み込み関数とメソッドへの呼び出しを最適化しますか?

答えて

4

(Pythonの標準ライブラリとnumpyの両方から)組み込み関数の限定セットは、そのnumbaがネイティブコードに変換する方法を知っているがあります:他に

http://numba.pydata.org/numba-doc/latest/reference/pysupported.html http://numba.pydata.org/numba-doc/latest/reference/numpysupported.html

ものは、することができませんnopythonモードでNumbaによってジッタされているので、はるかに遅いobjectmodeに頼っています。

Numbaにcython関数を渡して直接nopythonモードで認識させる方法はありません。

http://numba.pydata.org/numba-doc/latest/reference/pysupported.html#cffi

あなたがCレベルでの低レベルのラッパーを作成することができればcythonを呼び出すことがリグまでのことができるかもしれないことを、Cコードの外に呼び出すために活用することができます。Numbaはcffiのためのフックを持っています;私はこれが可能なら100%確信していません。私はNumbaからRMath関数を呼び出すため、このことについて書きました:

https://www.continuum.io/blog/developer-blog/calling-c-libraries-numba-using-cffi

あなたはそのルートを行けばそれはあなたが始めるのに役立つかもしれません。

+0

ありがとう、良い情報! 1)これがNumbaの実装や本質的に難しいものの制限であるかどうか知っていますか? 2)Cython関数用のCFFIラッパーを作成する際に重大な問題が発生するようなサウンドにする。私は単にC側で関数ポインタを取得して、CFFI/ctypes関数オブジェクトとして適切なシグネチャを使用してラップすることはできませんでしたか?あなたはそのアプローチに何らかのトラブルを予見していますか? – cfh

関連する問題