現在、次のループをcythonに変換しようとしています:
cimport numpy as np
cimport cython
@cython.boundscheck(False) # turn of bounds-checking for entire function
def Interpolation(cells, int nmbcellsx):
cdef np.ndarray[float, ndim=1] x,y,z
cdef int i,j,len
for i in range(nmbcellsx):
x = cells[i].x
y = cells[i].y
z = cells[i].z
len = x.size
for j in range(len):
x[j] = x[j] * y[j] * z[j]
return 0
これまでのところ、すべて問題ないように見えますが、cells[i].* へのアクセスにはまだ Python 呼び出しが必要です。これにより、i ループの並列化が妨げられます。
これは cython フィードバックです (cython -a で生成されます):
したがって、質問: これらの python コールバックを削除するにはどうすればよいですか (つまり、9 行目から 12 行目が白くなるように)。
次のようにセルのタイプを追加しようとすると:
cimport numpy as np
cimport cython
cdef class cell_t:
cdef np.ndarray x,y,z
@cython.boundscheck(False) # turn of bounds-checking for entire function
def Interpolation(np.ndarray[cell_t,ndim=1] cells, int nmbcellsx):
cdef np.ndarray[float, ndim=1] x,y,z
cdef int i,j,len
for i in range(nmbcellsx):
x = cells[i].x
y = cells[i].y
z = cells[i].z
len = x.size
for j in range(len):
x[j] = x[j] * y[j] * z[j]
return 0
次のcythonエラーが表示されます:dtypeは「オブジェクト」、数値型、または構造体でなければなりません(宣言内のcell_tについて不平を言っています)
どうもありがとう。