私はPythonでかなり大きなシミュレーションを書いており、Cythonからいくつかの追加のパフォーマンスを得ることを望んでいました。しかし、以下のコードでは、かなり大きなループが含まれていても、それほど多くを得ていないようです。およそ100,000回の反復。Cythonの最適化
私は初心者の間違いを作ったのですか、このループの大きさは大きかったのですか? (私のテストでは、Cythonコードは約2倍の速さでした)。
import numpy as np;
cimport numpy as np;
import math
ctypedef np.complex64_t cpl_t
cpl = np.complex64
def example(double a, np.ndarray[cpl_t,ndim=2] A):
cdef int N = 100
cdef np.ndarray[cpl_t,ndim=3] B = np.zeros((3,N,N),dtype = cpl)
cdef Py_ssize_t n, m;
for n in range(N):
for m in range(N):
if np.sqrt(A[0,n]) > 1:
B[0,n,m] = A[0,n] + 1j * A[0,m]
return B;
あなたはループの中で 'np.sqrt'呼び出しを行っています。パフォーマンスの問題のように見えます。とにかくそれはなぜループに入っていますか? 'a'は決して変化しません。なぜ、a <= 1ならば、ループの前にBを返しますか? – user2357112
@GWW:それは私の最初の行のように見えます。 – user2357112
@ user2357112これは実際に私が見落としたものですが、私はそれを外に出すことができます。実際には、np.sqrt()やnp.exp()のような数学演算は、私がcythonで避けなければならないものですか? – physicsGuy