有关类型化内存视图的Cython文档列出了分配给类型化内存视图的三种方式:
从原始的C指针
从np.ndarray和
从cython.view.array。
假设我没有从外部将数据传递到cython函数中,而是想分配内存并将其返回为np.ndarray,那么我选择了哪些选项?还要假设该缓冲区的大小不是编译时常量,即我无法在堆栈上分配,但需要malloc为选项1 分配。
因此,这三个选项看起来像这样:
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.是最快的方法。
建议使用三种方法中的哪一种?还是有其他更好的选择?
后续问题:np.ndarray在函数中使用该内存视图后,我想最终将结果返回为。类型化的内存视图是最佳选择,还是我宁愿只使用如下所示的旧缓冲区接口来创建一个ndarray?
cdef np.ndarray[DTYPE_t, ndim=1] b = np.empty(N, dtype=np.int32)
波斯汪
慕容3067478
相关分类