Автор оригинала: Pankaj Kumar.
Коллекция мусора Python – это механизм управления памятью в Python. Давайте посмотрим на разные аспекты сборки мусора и как работает коллекция мусора Python.
Что такое сборщик мусора?
Сборка мусора – это процесс очистки общего компьютера памяти, которая в настоящее время должна использоваться запущенной программой, когда эта программа больше не нуждается в этой памяти. С сборкой мусора этот кусок памяти очищается так, что другие программы (или же программа) могут использовать его снова.
Сборка мусора – это функция управления памятью во многих языках программирования. В этом уроке мы изучаем, как этот механизм работает в Python.
Коллекция мусора Python
Давайте изучим сборную мусор Python с помощью примера:
class User(object): def __del__(self): print("No reference left for {}".format(self)) user1 = User() user2 = user1 user3 = user1
В этом примере мы сделали класс и 3 опорных переменных, указывающих на тот же объект. Давайте визуализируем это:
Теперь мы позволяем переменным User1, User2 и User3 указать None вместо пользовательского экземпляра.
>>> user1 = None >>> user2 = None >>> user3 = None No reference left for <__main__.User object at 0x212bee9d9>
С вышеуказанным кодом ссылки изменились на:
После того, как мы присваиваем последнюю переменную User3
к Нет
Объект является собранным мусором, и это называет __del__
функция.
Как сборка мусора варьируется в зависимости от реализации
Коллекция мусора – это механизм, который варьируется в зависимости от реализации Python, как CPYthon, Jython или IronPython.
- C Реализация Python использует ссылку на отслеживание недоступных объектов. Вместо этого он не отслеживает объекты на каждой строке выполнения, он периодически выполняет алгоритм обнаружения цикла, который ищет недоступных объектов и очищает их.
- Jython использует сборщик мусора JVM. То же самое относится к Ironpython, который использует сборщик мусора CLR
Если вы хотите учиться о GC интерфейс Посмотрите на документы Python.
Коллекция мусора Python Force
Как мы изучали выше, сборка мусора работает автоматически, так как программа находится под выполнением, иногда мы можем захотеть запустить сборку мусора в определенное время. Мы можем сделать это, позвонив собирать ()
функция. Давайте попробуем определить LinkedList класс, чтобы продемонстрировать это:
class LinkedList(object): def __init__(self, name): self.name = name self.next = None def set_next(self, next): print('Linking nodes %s.next = %s' % (self, next)) self.next = next def __repr__(self): return '%s(%s)' % (self.__class__.__name__, self.name)
Как только это сделано, мы можем начать строить свои объекты и вызвать сбор мусора вручную:
# Constructing a circular LinkedList a = LinkedList('1') b = LinkedList('2') c = LinkedList('3') a.set_next(b) b.set_next(c) c.set_next(a) # Remove references to the LinkedList nodes in this module's namespace a = b = c = None # Show the effect of garbage collection for i in range(2): print('Collecting %d ...' % i) n = gc.collect() print('Unreachable objects:', n) print('Remaining Garbage:', pprint.pprint(gc.garbage)) print
Когда мы запускаем это, выход будет:
В этом примере объекты циклического LinkedList очищаются, как только коллекция Garbrge работает в первый раз.
Сводка коллекции мусора Python
Здесь давайте предоставляем некоторые конечные способы, через которые мы можем оптимизировать использование мусора:
- Не заставляйте собирать мусор слишком много раз. Это связано с тем, что даже если они освобождают память, он все еще требует времени для оценки права на предмет мусора.
- Если вы хотите вручную управлять сборкой мусора в своем приложении, начните делать это только после того, как приложение полностью запущено, а затем продолжить делать это в устойчивых операциях.
Коллекция мусора – это сложный механизм, если управляется вручную. Чтобы получить правильно, внимательно изучите контракт.