释放数组中项目的内存

时间:2014-06-06 18:48:29

标签: python arrays memory-management

我知道delgc模块,但我想知道你是否可以在循环时释放数组内的内存;不要混淆释放数组本身的内存。我想在打印后释放数组中项目的内存。这是我想要完成的一个人为的例子:

array = ['foo', 'bar', 'foobar']
for item in array:
  print item
  del item

这会释放项目foobarfoobar的内存吗?

3 个答案:

答案 0 :(得分:1)

释放列表中项目使用的内存的方法是删除列表位置(例如del array[1])或将其他内容分配给它(例如array[1] = None)。如果你不关心列表本身使用的内存是否被回收,那么第二个更快,因为它不需要移动任何内存。

在任何一种情况下,只要没有对该对象的其他引用,就会释放其内存。所以:

array = ['foo', 'bar', 'foobar']
for index, item in enumerate(array):
    print item
    array[index] = None

# at the end of the loop, `item` still points to the final item
# so you might want to do the same to make sure it gets released
item = None

答案 1 :(得分:1)

不,你可以自己检查一下。

您的代码:

array = ['foo', 'bar', 'foobar']
for item in array:
    del item
print array # ['foo', 'bar', 'foobar'] 

array删除一个元素:

array = ['foo', 'bar', 'foobar']
del array[1]
print array # ['foo', 'foobar']

删除array

中的所有内容
array = ['foo', 'bar', 'foobar']
del array[:]
print array # []

注意: 'foo' 将被垃圾收集(即内存不会被释放),当有另一个引用它时:

array = ['foo', 'bar', 'foobar']
x = array[0]
del array[:]
print array # []
print x # foo

答案 2 :(得分:0)

不是在您使用for循环迭代它时尝试修改列表,请尝试以下操作:

array = ['foo', 'bar', 'foobar']
while array:
    item = array.pop()

这将在你通过它时删除数组中的项目,允许它们被垃圾收集。但是,这将导致您以相反的顺序浏览列表。如果这是一个问题,请先使用array.reverse()

想要使用array.pop(0) - 尽管这允许您按正常顺序浏览数组,但它比从末尾弹出要慢几个数量级。当列表非常小时,这不是真的,但如果是这种情况,你可能不会首先担心内存使用。