Я заметил, что когда генератор исчерпан, объект остается в памяти. Как я могу заставить объект-генератор автоматически удаляться из памяти после его исчерпания?
Вы можете попробовать создать генератор обертки, чтобы убедиться, что он не имеет ссылки на внутренний генератор после его завершения. Возможно, это даже возможно (полностью непроверенный):
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
.
Это не операция, поддерживаемая Python.
del generator
.