logo

Събиране на боклук в Python

Събиране на боклука в Python е автоматичен процес, който управлява разпределението и освобождаването на паметта, като осигурява ефективно използване на паметта. За разлика от езици като напр В или C++ където програмистът трябва ръчно да разпределя и освобождава памет Python автоматично управлява памет чрез две основни стратегии:

  1. Преброяване на справки
  2. Събиране на боклук

Преброяване на справки

Python използва броене на справки за управление на паметта. Всеки обект следи колко препратки сочат към него. Когато броят на препратките падне до нула, т.е. не останат препратки, Python автоматично освобождава обекта. Пример:

Python
import sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x)) 

Изход
2 3 2 

Обяснение:



  • х се препраща два пъти първоначално (веднъж от x веднъж от getrefcount()).
  • Възлагане y = x увеличава броя.
  • Настройка y = Няма премахва една препратка.

Проблем с преброяването на справки

Преброяването на препратки е неуспешно при наличие на циклични препратки, т.е. обекти, които се препращат един към друг в цикъл. Дори ако нищо друго не сочи към тях, техният референтен брой никога не достига нула. Пример:

Python
import sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y)) 

Изход
3 3 

Обяснение:

  • х съдържа и и и съдържа х .
  • Дори след изтриване х и и Python няма да може да освободи паметта само с помощта на преброяване на препратки, защото всеки все още препраща към другия.

Събиране на отпадъци за циклични препратки

Събиране на боклук е техника за управление на паметта, използвана в езиците за програмиране за автоматично възстановяване на памет, която вече не е достъпна или не се използва от приложението. За да се справи с такива кръгови препратки, Python използва a Събирач на боклук (GC) от вградения gc модул. Този колектор е в състояние да открива и почиства обекти, включени в референтни цикли.

Генерационно събиране на отпадъци

Generation Garbage Collector на Python е проектиран да се справя с циклични препратки. Той организира обектите в три поколения въз основа на техния живот:

  • Поколение 0: Новосъздадени обекти.
  • Поколение 1: Обекти, които са преживели един цикъл на събиране.
  • Поколение 2: Дългоживеещи обекти.

Когато възникнат референтни цикли, събирачът на отпадъци автоматично ги открива и почиства, освобождавайки паметта.

Автоматично събиране на отпадъци от цикли

Събирането на отпадъци се изпълнява автоматично, когато броят на разпределенията надвишава броя на освобождаванията с определен праг. Този праг може да бъде проверен с помощта на gc модула.

Python
import gc print(gc.get_threshold()) 

Изход
(2000 10 10) 

Обяснение: Той връща праговия кортеж за поколения 0 1 и 2. Когато разпределенията надхвърлят праговото събиране се задейства.

Ръчно събиране на боклука

Понякога е полезно ръчно да извикате събирача на отпадъци, особено в случай на референтни цикли. Пример:

Python
import gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c) 

Изход
0 10 

Обяснение:

  • определено забавно (i) създава циклична препратка, като самата прави препратка към речника.
  • gc.collect() задейства събирането на отпадъци и съхранява броя на събраните обекти (първоначално 0).
  • за i в диапазона (10) обаждания забавно (i) 10 пъти създаване на 10 циклични препратки.
  • gc.collect() отново задейства събирането на отпадъци и отпечатва броя на събраните цикли.

Видове ръчно събиране на боклука

  • Събиране на отпадъци, базирано на времето: Събирачът на отпадъци се задейства на фиксирани интервали от време.
  • Събиране на отпадъци въз основа на събития: Събирачът на отпадъци се извиква в отговор на конкретни събития, като например когато потребител излезе от приложението или когато приложението стане неактивно.

Принудително събиране на боклука

Колекторът за боклук (GC) на Python работи автоматично, за да изчисти неизползваните обекти. За да го принудите ръчно, използвайте gc.collect() от gc модула. Пример:

Python
import gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect() 

Обяснение:

  • от a b c изтрива препратки към а б и c което ги прави допустими за събиране на боклука.
  • gc.collect() принуждава събирането на боклук, за да освободи памет чрез почистване на нереферирани обекти.

Деактивиране на събирането на боклук

В Python събирачът на отпадъци се изпълнява автоматично, за да изчисти нереферираните обекти. За да предотвратите стартирането му, можете да го деактивирате с помощта на gc.disable() от gc модула. Пример:

Python
import gc gc.disable() gc.enable() 

Обяснение:

  • gc.disable() забранява автоматичното събиране на отпадъци.
  • gc.enable() активира отново автоматичното събиране на отпадъци.

Взаимодействие с python събирач на отпадъци

Вграден механизъм, наречен събирач на боклук на Python, автоматично елиминира обекти, които вече не са посочени, за да освободи памет и да спре изтичането на памет. Модулът gc на Python предлага редица начини за взаимодействие със събирача на отпадъци, който често се изпълнява автоматично.

1. Активиране и деактивиране на събирача на отпадъци: Можете да активирате или деактивирате събирача на отпадъци, като използвате gc. позволи () и gc. забрани() функции съответно. Пример :

конкатенация на низове
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Принудително събиране на боклука: Можете ръчно да задействате събиране на боклук, като използвате gc. събирам () функция. Това може да бъде полезно в случаите, когато искате да принудите незабавно събиране на боклука, вместо да чакате автоматичното събиране на боклука.  Пример:

Python
import gc gc.collect() 

3. Проверка на настройките на събирача на отпадъци: Можете да проверите текущите настройки на събирача на отпадъци, като използвате gc.get_threshold() функция, която връща кортеж, представляващ текущите прагове за поколения 0 1 и 2.  Пример:

Python
import gc t = gc.get_threshold() print(t) 

Изход
(2000 10 10) 

4. Задаване на прагове за събиране на отпадъци: Можете да зададете праговете за събиране на боклук, като използвате gc.set_threshold() функция. Това ви позволява ръчно да регулирате праговете за различни поколения, което може да повлияе на честотата на събиране на отпадъци.  Пример:

Python
import gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t) 

Изход
(500 5 5) 

Предимства и недостатъци 

Нека проучим някои от предимствата и недостатъците на събирането на отпадъци на Python.

Предимства

Недостатъци

Автоматично управление на паметта

Може да въведе допълнителни разходи за производителност

Без ръчна обработка на паметта

Изисква разбиране на концепциите за паметта

Ефективно почистване чрез поколения

Ограничен контрол върху времето на GC

Персонализируеми GC настройки

Възможност за грешки или изтичане на памет

Създаване на тест