2

行列を計算する関数がありますが、非常に遅いです。cython でも動作が遅いので、以下のコードを強化するために何かできないかと思っていました。

編集:変更または追加しました

des = np.zeros([n-m+1,m])cdef np.ndarray des = np.zeros([n-m+1,m], dtype=DTYPE)(これは、追加したnp.empty... と言うよりも高速ですが、何も役に立たなかったようです。m/2cdef int m2 = m/2

cimport numpy as np
cimport cython

DTYPE = float
ctypedef np.float_t DTYPE_t

@cython.boundscheck(False)
@cython.cdivision(True)
@cython.wraparound(False)
cpdef map4(np.ndarray[DTYPE_t, ndim=1] s, int m): 

  cdef int n = len(s)
  cdef int i
  cdef int j

  des = np.zeros([n-m+1,m])
  for j in xrange(m):
      for i in xrange(m/2,n-m/2-1):
          des[i-m/2,j] = s[i-j+m/2]

  return des, s, m, n

通常n~10000、 とm=1001.

4

3 に答える 3

3

試す:

cdef np.ndarray des = np.zeros([n-m+1,m])

パラメータ s で行ったように、これをより具体的にすることもできます。境界チェックをオフにすることもできます。cython numpy チュートリアルをご覧ください。

変数を作成することもできます。

cdef int m_2 = m/2

m/2Cythonがその最適化を行うかどうかわからないので、どこでもそれを使用してください。

于 2013-03-12T18:43:35.650 に答える
2

np.empty各要素を割り当てると仮定すると、の代わりに使用することも役立つnp.zeros場合があります。

des = np.empty([n-m+1,m])
于 2013-03-12T19:00:15.427 に答える