我目前正在尝试将以下循环转换为 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-loop 的并行化。
这是一个 cython 反馈(使用 cython -a 生成):
因此问题是:如何删除这些 python 回调(即,使第 9-12 行变为白色)?
当我尝试像这样添加 Cell 的类型时:
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 must be "object", numeric type or a struct(它抱怨声明中的 cell_t)
非常感谢。