Рубрики
Без рубрики

Сборка мусора в Python

В этой статье я познакомлю вас с концепцией сборки мусора в Python. Сборка мусора-это способ, с помощью которого Python управляет своей памятью

Автор оригинала: Pankaj Kumar.

В этой статье я познакомлю вас с концепцией сборки мусора в Python. Сборка мусора-это способ, с помощью которого Python автоматически управляет своей памятью.

Это делается с помощью счетчика ссылок. Поэтому, прежде чем мы перейдем к концепции сборки мусора, давайте разберемся, что такое счетчик ссылок.

содержание

  • Что такое счетчик ссылок в Python?
  • Как работает сборка мусора в Python?
  • Что такое Эталонный цикл?
  • Как мы узнаем, когда будет запущена сборка мусора?
  • Работа со Сборкой мусора вручную
  • В чем может быть причина, если сбор мусора не происходит?
  • Вывод
  • Рекомендации

Что такое счетчик ссылок в Python?

Счетчик ссылок-это количество ссылок, сделанных на объект в запущенной программе. Это позволяет компилятору Python знать, когда используется переменная и когда безопасно удалять объект из памяти.

Это сокращает работу программистов по отслеживанию объектов, заполняющих системные ресурсы, и позволяет им сосредоточиться на создании программ.

Как работает сборка мусора в Python?

Давайте разберемся, как Python использует счетчики ссылок для выполнения сборки мусора на серверной части. Мы можем понять это на простом примере.

Сначала мы рассмотрим, как подсчитываются ссылки, а затем рассмотрим, как Python идентифицирует, когда нет ссылок на объект.

Взгляните на приведенный ниже код:

# Increasing reference count as more variables link to it

reference1 = 9 # Reference count for the value 9, becomes 1
reference2 = reference1 # Reference count for value 9 becomes 2
reference3 = reference1 # Reference count for value 9 becomes 3

# Decreasing reference count as the variable values change
reference2 = 10 # Reference count for value 9 decreases to 2
reference3 = 5 # Reference count for value 9 decreases to 1
reference1 = 1 # Reference count for value 9 decreases to 0

# After the reference value becomes 0, the object is deleted from memory

Как видно из вышеизложенного, значение 9 больше не имеет ссылок в памяти, как только значение последней ссылающейся переменной “reference1” изменяется на 1.

Как только интерпретатор Python не видит ссылок на значение во всем коде, сборщик мусора освобождает память для этого значения, чтобы освободить место.

Что такое Эталонный цикл?

Давайте рассмотрим еще одну концепцию, называемую эталонным циклом. В этом случае мы просто отсылаем объект к самому себе. Взгляните на пример кода ниже:

>>> a = []
>>> a.append(a)
>>> print a
[[...]]

Далее мы сделаем a= [], и будет создан пустой список. a.append() означает, что мы собираемся добавить что-то в этот список.

В этом случае: a. Итак, мы добавим еще один пустой список к этому объекту. Так что же здесь происходит?

Если мы вызовем a , то увидим, что здесь есть два списка.

Итак, мы создали пустой список, а затем добавили этот список к себе в объект. Итак, в объекте у нас есть список, а затем внутри этого объекта список снова вызывается, так что счетчик ссылок увеличивается до 1.

Но мы больше не используем a , наша программа больше не вызывает его, но счетчик ссылок равен 1.

У Python есть способ удалить ссылочные циклы, и он делает это не сразу. Он делает это после стольких вхождений ссылок, ссылающихся на что-то, а затем не ссылающихся на что-то, и это вхождение.

Поэтому в этом случае после стольких вхождений python запустит свою сборку мусора, и он войдет в память и посмотрит на каждый объект.

Когда он зайдет в память и посмотрит на каждый объект, он увидит, что этот объект ссылается на себя и нашу программу, которая больше не вызывает его, но у нее есть количество ссылок, равное единице, но ничто не вызывает его.

Так что он собирается пойти дальше и удалить это.

Как мы узнаем, когда будет запущена сборка мусора?

Ну, мы можем посмотреть на это с помощью модуля Python под названием сборка мусора . Мы импортируем модуль сбора мусора с помощью import gc.

Затем мы получаем пороговое значение, чтобы знать, когда сборка мусора будет продолжаться и перехватывать эти опорные циклы.

Мы можем извлечь эту информацию, набрав gc.get_threshold().

import gc
gc.get_threshold()

В приведенных выше двух строках кода отображаются следующие выходные данные.

(700,10,10)

Давайте поближе посмотрим на результат. Значение ” 700 ” означает, что после 700 вхождений ссылок, ссылающихся на что-то, а затем разыменования, Python будет продолжать собирать циклы ссылок.

Проще говоря, после 700 вхождений Python запустит скрипт или алгоритм, который будет проходить и очищать вашу память.

Хотя Python делает это автоматически, когда счетчик ссылок достигает 0, когда у вас счетчик ссылок застрял на 1 из-за цикла ссылок. Тогда только после 700 вхождений Python запустит свою сборку мусора, чтобы поймать циклы.

Работа со Сборкой мусора вручную

Мы можем изменить это с помощью модуля. Мы не будем подробно останавливаться на этом в этой статье, но просто имейте в виду, что вы можете изменить это.

Код для того же самого, как показано ниже.

Пользователь также может просто включить или выключить сборку мусора. Вы так много можете сделать с помощью модуля.

import gc
gc.disable()  

class Track:
    def __init__(self):
        print("Intitialisting your object here")
    def __del__(self):
        print("Deleting and clearing memory")

print("A")
A = Track()
print("B")
B = Track()

print("deleting here...")
del A
del B  

gc.collect() 

Чтобы объяснить приведенный выше код, вкратце, я импортировал модуль сборщика мусора, но отключил сборку мусора в начале кода с помощью gc.disable() .

Это делается для того, чтобы гарантировать, что автоматическая сборка мусора не будет выполнена. Затем трек класса определяется только с помощью конструктора и деструктора. Два объекта были определены как A и B, которые печатают Инициализацию вашего объекта здесь в консоли после их определения.

Затем объекты удаляются с помощью метода del , и они печатаются Удаление и очистка памяти в консоли после успешного удаления объекта.

Метод gc.collect() гарантирует, что сборщик мусора освободит пространство памяти, занимаемое объектами A и B.

Так что, когда мы туда доберемся, вы увидите, как много мы сможем с этим сделать. Но пока просто знайте, что python очень хорошо справляется с управлением нашей памятью.

В чем может быть причина, если сбор мусора не происходит?

Еще одна вещь, на которую я хочу обратить внимание, заключается в том, что если ваша память близка к заполнению и израсходована, сборка мусора не будет выполняться, потому что для запуска сборки мусора требуется память.

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

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

Вывод

Надеюсь, эта статья была проницательной. Сообщите нам, что вы думаете, в разделе обратной связи ниже.

Рекомендации

Рекомендации