cython:在不为数据分配内存的情况下创建ndarray对象



在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,内存被分配并被零填充,这将永远不会被使用。我该如何避免这种情况?

抛开效率不谈,这种赋值会编译吗?

np.empty不是零填充。np.zeros做到了这一点,甚至这也是"动态"完成的。

为什么numpy.zeros_like和numpy.zeros_like之间存在性能差异?探讨了emptyzeroszeros_like是如何实现的。


我只是cython的初学者,但我必须使用:

tmp_buffer.data = <char *>my_buffer

不如换一种方式,使my_buffer成为tmp_buffer中分配的data

array1 = np.empty(bsize, dtype=int)
cdef int *data
data = <int *> array1.data
for i in range(bsize):
    data[i] = bsize-data[i]

http://gael-varoquaux.info/programming/cython-example-of-exposing-c-computed-arrays-in-python-without-data-copies.html建议使用CCD_ 11从现有数据缓冲区创建阵列。

关于内存视图http://docs.cython.org/src/userguide/memoryviews.html

相关内容

最新更新