Performance Cython:如何有效地对memoryviewslice对象求和?

Performance 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

我试图加速一个函数,它计算矩阵中每个元素右边所有元素的和[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 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中执行相同的操作相比,不会给您带来任何性能优势。