有关类型化内存视图的Cython文档列出了三种分配给类型化内存视图的方法:
np.ndarray和cython.view.array.假设我没有从外部传入我的cython函数的数据,而是想分配内存并将其作为a返回np.ndarray,我选择了哪些选项?还假设该缓冲区的大小不是编译时常量,即我不能在堆栈上分配,但需要malloc选项1.
因此,3个选项可以解释如下:
from libc.stdlib cimport malloc, free
cimport numpy as np
from cython cimport view
np.import_array()
def memview_malloc(int N):
    cdef int * m = <int *>malloc(N * sizeof(int))
    cdef int[::1] b = <int[:N]>m
    free(<void *>m)
def memview_ndarray(int N):
    cdef int[::1] b = np.empty(N, dtype=np.int32)
def memview_cyarray(int N):
    cdef int[::1] b = view.array(shape=(N,), itemsize=sizeof(int), format="i")
让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.
一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.
推荐三种方法中的哪一种?或者有更好的选择吗? …
我使用numpexpr在大型数组上进行快速数学运算,但如果数组的大小小于CPU缓存,则使用简单数组数学在Cython中编写代码会更快,尤其是如果多次调用该函数.
问题是,你如何在Cython中使用数组,或者更明确地说:在Cython中是否有Python的array.array类型的直接接口?我想做的是这样的事(简单例子)
cpdef array[double] running_sum(array[double] arr):
    cdef int i 
    cdef int n = len(arr)
    cdef array[double] out = new_array_zeros(1.0, n)
    ... # some error checks
    out[0] = arr[0]
    for i in xrange(1,n-1):
        out[i] = out[i-1] + arr[i]
    return(out)
我首先尝试使用Cython numpy包装并使用ndarrays,但是与使用malloc创建C数组相比,创建它们对于小型1D数组来说似乎非常昂贵(但内存处理变得很麻烦).
谢谢!