cython - 如何定义大小的内存视图

时间:2015-05-24 19:13:20

标签: python cython

这可能是一个非常愚蠢的问题。假设我在Cython中有一个使用MemoryViews的代码,如下所示:

cdef extern from 'math.h' nogil:
    float NAN
...

cdef double[:] stat_vec(double[:] x, double m, char* stat_func):
    cdef:
        vector_ptr stat_func_ptr = stat_switch(stat_func)
        double[:] y = x.copy()
    y[:] = NAN
    ... < do_something_with_elements_of_x_and_populate_elements_of_y >
    return y

上面的代码使用MemoryView x并返回与y大小相同的另一个MemoryView x

要定义y的大小,我采用的是两步法:

  1. 首先我将y分配给x.copy()(我认为y大小合适)
  2. 然后我将y分配给NAN
  3. 由于nogil语句,我无法将此当前函数转换为x.copy()。是否有更好的替代方法来初始化y,其大小/形状为x,初始值为NAN

1 个答案:

答案 0 :(得分:0)

将函数转换为nogil的最简单方法是在函数外部分配y数组,并在每次函数调用时重新初始化它。

cdef double[::] stat_vec(double[::] x, double m, char* stat_func, double[::] y) nogil:

    cdef long i, n
    n = x.shape[0]
    for i in range(n):
        y[i] = x[i]
    # do other calculations

这在性能方面也是首选,因此,如果多次调用y,则不会花时间分配/取消分配stat_vec数组。