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

1

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

  • 1
    Если у вас есть только одна ссылка, просто del generator .
  • 0
    @agf: Пожалуйста, опубликуйте свой ответ как ответ, чтобы мы могли правильно его оценить.
Показать ещё 1 комментарий
Теги:
generator
memory-management

2 ответа

1
Лучший ответ

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

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.

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню