【问题标题】:cython: create ndarray object without allocating memory for datacython:创建 ndarray 对象而不为数据分配内存
【发布时间】: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) 语句,我会收到“双重免费”错误消息。

标签: numpy cython


【解决方案1】:

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

np.empty 不填零。 np.zeros 会这样做,甚至是“即时”完成的。

Why the performance difference between numpy.zeros and numpy.zeros_like? 探讨了emptyzeroszeros_like 是如何实现的。


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

tmp_buffer.data = <char *>my_buffer

换个方式怎么样,让my_buffer 分配给tmp_bufferdata

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 建议使用np.PyArray_SimpleNewFromData 从现有数据缓冲区创建一个数组。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 2023-03-18
    • 2012-01-08
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多