私は、numpy.log
のようないくつかのnumpy/scipy数学関数に大きく依存しているCythonで計算しようとしています。私はCythonのループで繰り返しnumpyの/ scipyのダウンロード機能を呼び出す場合、例えば、巨大なオーバーヘッドコストがあることに気づい:Python呼び出しのオーバーヘッドなしで直接numpy/scipy C関数をCythonから呼び出す方法は?
import numpy as np
cimport numpy as np
np.import_array()
cimport cython
def myloop(int num_elts):
cdef double value = 0
for n in xrange(num_elts):
# call numpy function
value = np.log(2)
np.log
ではなくnumpyのCの関数を呼び出すよりも、Pythonの経由するので、これはおそらく、非常に高価です直接。その行を次のように置き換えた場合:
from libc.math cimport log
...
# calling libc function 'log'
value = log(2)
これははるかに高速です。しかし、私がしようとすると、libc.math.logするnumpyの配列を渡す:
TypeError: only length-1 arrays can be converted to Python scalars
私の質問
は次のとおりです:- をすることは可能ですがこのエラーを与える
cdef np.ndarray[long, ndim=1] foo = np.array([1, 2, 3]) log(foo)
Cの関数を呼び出してnumpyの配列を渡しますか?または、これはスカラー値でのみ使用できます(例えば、上記の
foo
配列にそれを適用したい場合など)。 - 同様の方法で、Cからscipy関数を直接呼び出すことはできません。 Pythonのオーバーヘッド?どのようにscipyのC関数ライブラリをインポートできますか?
具体例:あなたはCythonでfor
ループ内のスカラ値にscipyのダウンロード用のまたはnumpyのの便利な統計機能(例えばscipy.stats.*
)の多くを呼びたいと言いますか? Cythonでこれらの関数を再実装するのは夢中なので、C言語のバージョンを呼び出す必要があります。たとえば、pdf/cdfに関連するすべての関数とさまざまな統計分布からのサンプリング(例えばhttp://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.rv_continuous.pdf.html#scipy.stats.rv_continuous.pdfとhttp://www.johndcook.com/distributions_scipy.htmlを参照)これらの関数をPythonのオーバーヘッドでループ内で呼び出すと、非常に遅くなるでしょう。
ありがとうございました。
「scipy.stats」pdfなど関数は主にPythonで実装されています。一度に多くの数値を処理することでオーバーヘッドを避けることができます。 –