のようなnumpy/scipy数学関数に大きく依存するCythonで計算を行おうとしていますnumpy.log
。Cython のループで numpy/scipy 関数を繰り返し呼び出すと、次のような膨大なオーバーヘッド コストが発生することに気付きました。
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)
その後、はるかに高速です。ただし、numpy 配列を libc.math.log に渡そうとすると、次のようになります。
cdef np.ndarray[long, ndim=1] foo = np.array([1, 2, 3])
log(foo)
次のエラーが発生します。
TypeError: only length-1 arrays can be converted to Python scalars
私の質問は次のとおりです。
- C関数を呼び出してnumpy配列を渡すことは可能ですか?
foo
または、ループを記述する必要があるスカラー値でのみ使用できます (たとえば、上記の配列に適用したい場合)。 - Python のオーバーヘッドなしで C から直接 scipy 関数を呼び出す同様の方法はありますか? scipy の C 関数ライブラリをどのようにインポートできますか?
具体例: Cython のループscipy.stats.*
内のスカラー値に対して、scipy または numpy の有用な統計関数 (例: ) の多くを呼び出したいとしますか? for
これらすべての関数を 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 オーバーヘッドを使用してこれらの関数を呼び出すと、非常に遅くなります。
ありがとう。