为什么python list slice赋值会占用内存?

时间:2010-07-30 08:22:31

标签: python memory memory-leaks memory-management

我正在与Python项目中的内存泄漏作斗争并且已经花了很多时间在它上面。我把这个问题推到了一个小例子。现在看来我知道解决方案,但我无法理解为什么

import random

def main():
    d = {}
    used_keys = []
    n = 0
    while True:
        # choose a key unique enough among used previously
        key = random.randint(0, 2 ** 60)
        d[key] = 1234 # the value doesn't matter
        used_keys.append(key)
        n += 1
        if n % 1000 == 0:
            # clean up every 1000 iterations
            print 'thousand'
            for key in used_keys:
                del d[key]
                used_keys[:] = []
                #used_keys = []

if __name__ == '__main__':
    main()

我的想法是在dict d中存储一些值并记住列表中使用的键,以便能够不时清理字典。

程序的这种变化充满信心地让记忆永远不会回来。如果我使用替代方法“清除”示例中注释的used_keys,一切都很好:内存消耗保持在恒定水平。

为什么?

在CPython和许多linux上测试过。

2 个答案:

答案 0 :(得分:5)

这就是原因 - 当前方法不会从dict中删除键(实际上只有一个)。这是因为您在循环期间清除used_keys列表,并且循环过早退出。

然而,第二个(注释)方法在为used_keys分配新值时起作用,因此循环成功完成。

看到之间的区别:

>>> a=[1,2,3]
>>> for x in a:
...    print x
...    a=[]
...
1
2
3

>>> a=[1,2,3]
>>> for x in a:
...    print x
...    a[:] = []
...
1
>>>

答案 1 :(得分:0)

为什么这样的事情不起作用?

from itertools import count
import uuid

def main():
    d = {}
    for n in count(1):
        # choose a key unique enough among used previously
        key = uuid.uuid1()
        d[key] = 1234 # the value doesn't matter
        if n % 1000 == 0:
            # clean up every 1000 iterations
            print 'thousand'
            d.clear()

if __name__ == '__main__':
    main()