Python cdef cython中的数组在循环中改变大小,是否存在内存问题?

Python cdef cython中的数组在循环中改变大小,是否存在内存问题?,python,memory,memory-management,memory-leaks,cython,Python,Memory,Memory Management,Memory Leaks,Cython,我知道在cython中,我不能在循环中定义数组,我必须在循环之前这样做。如果在循环内部,我将在循环外部初始化的数组设置为每次迭代时的大小大不相同,会发生什么 想象一下这样的情景: cdef int i cdef int [:] A for i in range(100): A = np.zeros(np.random.randint(10, 1000), dtype=np.int32) A的大小在不同的迭代中会有很大的差异。这会导致任何类型的内存问题吗?有人能解释一下我在循环过程中记

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

想象一下这样的情景:

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

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

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

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


(正如@hpaulj在一篇评论中所说的,Cython不会对此进行任何加速,但我假设您的真实代码在循环中做了更多的工作)

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