Performance Cython:如何有效地对memoryviewslice对象求和?
我试图加速一个函数,它计算矩阵中每个元素右边所有元素的和[integer],并检查和是否为偶数。我试图使用cython(内存视图),但我让一切变得更糟D 我想,我没有正确理解类型定义,因为我在html文件中的wm[I,j]=(gx[I:,j].sum())%2行中得到了例如“Pyx_PyInt_From_npy_long”,我认为这都是npy_longPerformance Cython:如何有效地对memoryviewslice对象求和?,performance,numpy,cython,Performance,Numpy,Cython,我试图加速一个函数,它计算矩阵中每个元素右边所有元素的和[integer],并检查和是否为偶数。我试图使用cython(内存视图),但我让一切变得更糟D 我想,我没有正确理解类型定义,因为我在html文件中的wm[I,j]=(gx[I:,j].sum())%2行中得到了例如“Pyx_PyInt_From_npy_long”,我认为这都是npy_long import numpy as np cimport numpy as np cimport cython ctypedef np.int_t
import numpy as np
cimport numpy as np
cimport cython
ctypedef np.int_t dtype_int
@cython.wraparound(False)
@cython.boundscheck(False)
def test_fun(np.ndarray[dtype_int,ndim=2] gx_in, dtype_int n):
# Declarations
cdef dtype_int i,j
cdef dtype_int[:,:] gx
cdef dtype_int[:] gx_slice
gx = gx_in
# Init Array
wm_init = np.zeros((n,n), dtype = np.int)
cdef dtype_int[:,:] wm = wm_init
# Loop
for i in range(n):
for j in range(n):
gx_slice = gx[i:,j]
wm[i,j] = np.sum(gx_slice)%2
return wm
我使用了np.sum()而不是.sum()(速度更快),因为memoryviewslice对象显然没有“sum”属性。我找到了一种加速循环的方法(为sum插入显式循环)。它对我的案子有效,我想这和切片有关,尽管我不确定
ctypedef np.int_t dtype_int
@cython.wraparound(False)
@cython.boundscheck(False)
def test_fun(np.ndarray[dtype_int,ndim=2] gx_in, dtype_int n):
# Declarations
cdef dtype_int i,j,k, gx_sum
cdef dtype_int[:,:] gx
cdef dtype_int[:] gx_slice
gx = gx_in
# Init Array
wm_init = np.zeros((n,n), dtype = np.int)
cdef dtype_int[:,:] wm = wm_init
# Loop
for i in range(n):
for j in range(n):
gx_sum = 0
for k in range(i,n):
gx_sum += gx[k,j]
wm[i,j] = gx_sum%2
return wm
如果您在指向内存块的指针上迭代,而不是使用切片,则速度会更快。但是,是的,您肯定不想在一个紧密的循环中调用numpy函数,这与在cython中执行相同的操作相比,不会给您带来任何性能优势。