Автоматически удалять объект генератора из памяти при StopIteration (Python) - PullRequest
1 голос
/ 31 августа 2011

Я заметил, что когда генератор исчерпан, объект остается в памяти. Как я могу заставить объект-генератор автоматически удалять себя из памяти, когда он исчерпан?

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Вы можете попробовать создать генератор-обертку, который по окончании работы не будет иметь ссылки на внутренний генератор.Следующее может даже сделать это (полностью не проверено):

def strange(gen):
    for thing in gen:
        yield thing

Как только gen поднимает StopIteration, генератор strange выйдет из цикла for, а затем вернет None, что снова повысит StopIteration.Если gen была последней ссылкой на генератор, она должна быть / может быть доступна для сборки мусора до того, как какой-либо итеративный код по strange(gen) вернет управление.На CPython это означало бы, что он освобожден.

Обратите внимание, что это не поможет, если вы сделаете что-то вроде следующего:

g = some_generator()
for x in strange(g):
    do_something()

Поскольку g сама по себе является ссылкой на внутреннийгенератор.Вам придется использовать его более примерно так:

for x in strange(some_generator()):
    do_something()

Но на самом деле самый простой способ - делать то, что вы делаете с любым другим объектом, когда вы не хотите, чтобы он зависал в памяти:убедитесь, что вы не держитесь за ссылку на него.Если переменная, ссылающаяся на нее, находилась в долгоживущей области видимости, вы можете явно del it.

1 голос
/ 31 августа 2011

Эта операция не поддерживается Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...