Рубрики

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

Метод выделения и освобождения памяти в Python — автоматический. Пользователь не обязан предварительно выделять или освобождать память, аналогично использованию динамического выделения памяти в таких языках, как C или C ++.
Python использует две стратегии для выделения памяти:

  • Подсчет ссылок
  • Вывоз мусора

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

# Literal 9 - это объект

b = 9

  
# Счетчик ссылок объекта 9
# становится 0.

b = 4

Буквальное значение 9 является объектом. Счетчик ссылок объекта 9 увеличивается до 1 в строке 1. В строке 2 его счетчик ссылок становится равным нулю при разыменовании. Таким образом сборщик мусора освобождает объект.

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

def create_cycle():

  

    # создать список x

    x = [ ]

  

    # Ссылочный цикл создан

    # здесь, поскольку х содержит ссылку на

    # для себя.

    x.append(x)

   
create_cycle()

Поскольку create_cycle () создает объект x, который ссылается на себя, объект x не будет автоматически освобожден, когда функция вернется. Это приведет к тому, что память, которую использует x, будет удерживаться до вызова сборщика мусора Python.

Способы сделать объект пригодным для сбора мусора

x = []

x.append(l)

x.append(2)

  
# удалить список из памяти или
# присвоение объекта x None (Null)

del

# x = Нет

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

Автоматическая сборка мусора циклов

Поскольку эталонные циклы требуют вычислительной работы для обнаружения, сборка мусора должна быть запланированной операцией. Python планирует сборку мусора на основе порога выделения объектов и освобождения объектов. Когда количество выделений минус количество освобождений больше порогового значения, запускается сборщик мусора. Можно проверить порог для новых объектов (объекты в Python, известные как объекты поколения 0), импортировав модуль gc и запросив пороги сбора мусора:

# загрузка gc

import gc

  
# получить текущую коллекцию
# пороги как кортеж

print("Garbage collection thresholds:",

                    gc.get_threshold())

Выход:

Garbage collection thresholds: (700, 10, 10) 

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

Ручная сборка мусора

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

# Импорт модуля gc

import gc

  
# Возвращает количество
# объектов, которые он собрал
# и освобожден

collected = gc.collect()

  
# Печатает сборщик мусора
# как 0 объект

print("Garbage collector: collected",

          "%d objects." % collected)

Если создано несколько циклов, то как работает ручной сбор:
Пример:

import gc

i = 0 

  
# создать цикл и на каждой итерации x как словарь
# присвоено 1

def create_cycle():

    x = { }

    x[i+1] = x

    print x

  
# списки очищаются всякий раз, когда полная коллекция или
# коллекция самого высокого поколения (2) запущена

collected = gc.collect() # или gc.collect (2)

print "Garbage collector: collected %d objects." % (collected)

  

print "Creating cycles..."

for i in range(10):

    create_cycle()

  

collected = gc.collect()

  

print "Garbage collector: collected %d objects." % (collected)

Выход:

Garbage collector: collected 0 objects.
Creating cycles...
{1: {...}}
{2: {...}}
{3: {...}}
{4: {...}}
{5: {...}}
{6: {...}}
{7: {...}}
{8: {...}}
{9: {...}}
{10: {...}}
Garbage collector: collected 10 objects.

Существует два способа выполнения сборки мусора вручную: сборка мусора по времени и по событиям.
Основанный на время сбора мусора проста: сборщик мусор вызывается после фиксированного интервала времени.
Событийный мусора вызывает сборщик мусора на возникновении события. Например, когда пользователь выходит из приложения или когда приложение переходит в состояние ожидания.
Ссылка

  • Python Docs
  • Рекомендуемые посты:

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

    0.00 (0%) 0 votes