相关疑难解决方法(0)

为类型化内存视图分配内存的推荐方法是什么?

有关类型化内存视图Cython文档列出了三种分配给类型化内存视图的方法:

  1. 从原始C指针,
  2. 来自np.ndarray
  3. 来自a 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")
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是,在所有三种情况下,Cython为内存分配生成了大量代码,特别是调用__Pyx_PyObject_to_MemoryviewSlice_dc_int.这表明(我可能在这里错了,我对Cython内部工作的洞察力非常有限),它首先创建一个Python对象,然后将其"转换"到内存视图中,这似乎是不必要的开销.

一个简单的基准测试并未揭示三种方法之间存在很大差异,其中2是最薄弱的方法.

推荐三种方法中的哪一种?或者有更好的选择吗? …

python memory buffer memory-management cython

65
推荐指数
2
解决办法
1万
查看次数

高效数学运算使用cython在python中的小数组

我使用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)
Run Code Online (Sandbox Code Playgroud)

我首先尝试使用Cython numpy包装并使用ndarrays,但是与使用malloc创建C数组相比,创建它们对于小型1D数组来说似乎非常昂贵(但内存处理变得很麻烦).

谢谢!

python arrays performance numpy cython

9
推荐指数
1
解决办法
1572
查看次数