这可能是一个非常愚蠢的问题。假设我在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
的大小,我采用的是两步法:
y
分配给x.copy()
(我认为y
大小合适)y
分配给NAN
。 由于nogil
语句,我无法将此当前函数转换为x.copy()
。是否有更好的替代方法来初始化y
,其大小/形状为x
,初始值为NAN
?
答案 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
数组。