【问题标题】:cdef an array in cython that changes size in a loop, are there memory issues?cdef cython 中的一个数组,它在循环中改变大小,是否存在内存问题?
【发布时间】:2018-01-02 02:11:47
【问题描述】:

我知道在 cython 中我不能 cdef 循环内的数组,我必须在循环之前这样做。如果在循环内我将在循环外初始化的数组设置为在每次迭代时的大小差别很大,会发生什么?

想象一下这样的事情:

cdef int i
cdef int [:] A
for i in range(100): 
    A = np.zeros(np.random.randint(10, 1000), dtype=np.int32)

A 的大小在每次迭代中会有很大差异。这会导致任何类型的内存问题吗?当我通过循环时,有人可以解释一下内存中到底发生了什么吗?如果这是有问题的,还有其他选择吗?谢谢

【问题讨论】:

  • 我建议将此循环放在调用 Python 代码中,并使用 2d A 数组调用 Cython 函数。在处理A 时,专注于提高速度。像这样创建 A 并没有利用 Cython 的编译。

标签: python memory memory-management memory-leaks cython


【解决方案1】:

没有问题 - memoryviews 像普通 Python 对象一样被引用计数,所以当新数组分配给 A 时,旧数组的引用计数下降到 0 并被释放。

唯一的例外是您从指针而不是 Python 对象创建内存视图,在这种情况下您必须处理内存。但这并不适用于此。

(正如@hpaulj 在评论中所说,这不会从 Cython 获得任何加速,但我认为您的真实代码在循环中做了更多工作)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2013-12-25
    • 2014-05-09
    相关资源
    最近更新 更多