为什么numpy数组与列表的比较消耗了如此多的内存?

Hau*_*uke 6 python arrays memory-management numpy list

最近这一点刺痛了我.我通过删除代码中列表的numpy数组的所有比较来解决它.但为什么垃圾收集器会错过收集呢?

运行它,看它吃你的记忆:

import numpy as np
r = np.random.rand(2)   
l = []
while True:
    r == l
Run Code Online (Sandbox Code Playgroud)

在64位Ubuntu 10.04上运行,virtualenv 1.7.2,Python 2.7.3,Numpy 1.6.2

seb*_*erg 5

以防万一有人偶然发现并想知道......

@Dugal 是的,我相信这是当前 numpy 版本(2012 年 9 月)中的内存泄漏,在引发某些异常时发生(请参阅thisthis)。为什么添加gc@BiRico“修复”的调用对我来说似乎很奇怪,尽管它必须在出现之后立即完成?也许python垃圾收集回溯的方式很奇怪,如果有人知道异常处理和垃圾收集CPython Internals,我会感兴趣。

解决方法:这与列表没有直接关系,但例如大多数广播异常(空列表不适合数组大小,空数组会导致相同的泄漏。请注意,内部准备了一个永远不会出现的异常)。因此,作为一种解决方法,您可能应该首先检查形状是否正确(如果您经常这样做,否则我真的不会担心,如果我做对了,这只会泄漏一个小字符串)。

已修复:此问题将在 numpy 1.7 中修复。