【发布时间】:2015-03-04 11:48:03
【问题描述】:
在 cython 中,如何在不为其内容分配内存的情况下创建具有已定义属性的 ndarray 对象?
我的问题是我想调用一个需要 ndarray 但我的数据位于纯 c 数组中的函数。由于一些限制,我无法直接切换到使用 ndarray。
代码段来说明我的意图:
cdef:
ndarray[npy_uint64] tmp_buffer
uint64_t * my_buffer
tmp_buffer = np.empty(my_buffer_size, dtype='uint64')
my_buffer = <uint64_t *> malloc(my_buffer_size * sizeof(uint64_t))
(... do something with my_buffer that cannot be done with a ndarray ...)
tmp_buffer.data = my_buffer
some_func(tmp_buffer)
这似乎效率低下,因为对于tmp_buffer,内存已分配并填充为零,永远不会使用。我该如何避免这种情况?
【问题讨论】:
-
这比低效更糟糕,它是内存泄漏。 Numpy 将尝试通过调用
free(tmp_buffer.data)来释放它分配的内存,但当然会释放 my_buffer。 -
您可以创建一个 Cython 内存视图并将其作为 Numpy 数组返回,执行
return np.asarray(mymemoryview) -
我遇到了内存释放问题。如果我包含
free(my_buffer)语句,我会收到“双重免费”错误消息。