有关类型化内存视图的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是最薄弱的方法.
推荐三种方法中的哪一种?或者有更好的选择吗? …