Почему присвоение части списка Python ест память?

Я борюсь с утечкой памяти в проекте 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 и запомните используемые ключи в списке, чтобы смочь убрать dict время от времени.

Это изменение программы уверенно, никогда ест память не возвращая его назад. Если я использую альтернативный метод для „очищений” used_keys это прокомментировано в примере, все в порядке: потребление памяти остается на постоянном уровне.

Почему?

Протестированный на CPython и многих Linux.

6
задан nkrkv 30 July 2010 в 08:22
поделиться