logo

Сакупљање смећа у Питхон-у

Гарбаге Цоллецтион ин Питхон је аутоматски процес који управља алокацијом меморије и њеном ослобађањем обезбеђујући ефикасно коришћење меморије. За разлику од језика као нпр Ц или Ц++ где програмер мора ручно да додели и ослободи меморију Питхон аутоматски управља меморијом кроз две примарне стратегије:

  1. Бројање референци
  2. Сакупљање смећа

Бројање референци

Питхон користи бројање референци за управљање меморијом. Сваки објекат води евиденцију о томе колико референци указује на њега. Када број референци падне на нулу, тј. нема референци, Питхон аутоматски ослобађа објекат. Пример:

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 

Објашњење:



  • к на почетку се референцира двапут (једном са к једном од гетрефцоунт()).
  • Додељивање и = к повећава број.
  • Подешавање и = Ниједан уклања једну референцу.

Проблем са бројањем референци

Бројање референци не успева у присуству цикличних референци, тј. објеката који реферирају један на другог у циклусу. Чак и ако ништа друго не указује на њих, њихов број референци никада не достиже нулу. Пример:

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 

Објашњење:

  • к садржи и и и садржи к .
  • Чак и након брисања к и и Питхон неће моћи да ослободи меморију само помоћу бројања референци јер свака и даље упућује на другу.

Сакупљање смећа за цикличне референце

Сакупљање смећа је техника управљања меморијом која се користи у програмским језицима за аутоматско враћање меморије којој апликација више није доступна или је не користи. За руковање таквим кружним референцама Питхон користи а Гарбаге Цоллецтор (ГЦ) из уграђеног гц модула. Овај колектор је у стању да открије и очисти објекте укључене у референтне циклусе.

Генератионал Гарбаге Цоллецтион

Питхонов Генератионал Гарбаге Цоллецтор је дизајниран да се бави цикличним референцама. Он организује објекте у три генерације на основу њиховог животног века:

  • Генерација 0: Новостворени објекти.
  • Генерација 1: Објекти који су преживели један циклус прикупљања.
  • Генерација 2: дуговечни објекти.

Када дође до референтних циклуса, сакупљач смећа их аутоматски открива и чисти ослобађајући меморију.

Аутоматско скупљање отпада у циклусима

Сакупљање смећа се покреће аутоматски када број алокација премаши број делокација за одређени праг. Овај праг се може проверити помоћу гц модула.

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 

Објашњење:

  • деф фун(и) ствара цикличну референцу тако што сам прави референцу на речник.
  • гц.цоллецт() покреће сакупљање смећа и чува број сакупљених објеката (у почетку 0).
  • за ја у опсегу (10) позива забава (и) 10 пута креирање 10 цикличних референци.
  • гц.цоллецт() поново покреће сакупљање смећа и штампа број сакупљених циклуса.

Врсте ручног сакупљања смећа

  • Одлагање смећа засновано на времену: Сакупљач смећа се покреће у фиксним временским интервалима.
  • Сакупљање смећа засновано на догађајима: Сакупљач смећа се позива као одговор на специфичне догађаје као што је када корисник изађе из апликације или када апликација постане неактивна.

Принудно одвоз смећа

Питхон-ов сакупљач смећа (ГЦ) ради аутоматски да очисти неискоришћене објекте. Да бисте га присилили ручно, користите гц.цоллецт() из гц модула. Пример:

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

Објашњење:

  • од а б ц брише референце на а б и ц чинећи их квалификованим за одлагање смећа.
  • гц.цоллецт() присиљава прикупљање смећа да ослободи меморију чишћењем нереференцираних објеката.

Онемогућавање сакупљања смећа

У Питхон-у сакупљач смећа се покреће аутоматски да очисти нереференциране објекте. Да бисте спречили његово покретање, можете га онемогућити помоћу гц.дисабле() из гц модула. Пример:

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

Објашњење:

  • гц.дисабле() онемогућава аутоматско сакупљање смећа.
  • гц.енабле() поново омогућава аутоматско сакупљање смећа.

Интеракција са питхон сакупљачем смећа

Уграђени механизам назван Питхон сакупљач смећа аутоматски елиминише објекте који више нису референцирани како би се ослободила меморија и зауставило цурење меморије. Питхон гц модул нуди бројне начине за интеракцију са сакупљачем смећа који се често извршава аутоматски.

1. Омогућавање и онемогућавање сакупљача смећа: Можете омогућити или онемогућити сакупљач смећа користећи гц. омогућити() и гц. дисабле() функције респективно. Пример :

басх дужина низа
Python
import gc # Disable  gc.disable() # Enable gc.enable() 

2. Присилно одвоз смећа: Можете ручно да покренете сакупљање смећа користећи гц. прикупити() функција. Ово може бити корисно у случајевима када желите да наметнете тренутно сакупљање смећа уместо да чекате да дође до аутоматског сакупљања смећа.  Пример:

Python
import gc gc.collect() 

3. Провера подешавања сакупљача смећа: Можете да проверите тренутна подешавања сакупљача смећа користећи гц.гет_тхресхолд() функција која враћа тупле који представља тренутне прагове за генерације 0 1 и 2.  Пример:

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

Излаз
(2000 10 10) 

4. Постављање прагова сакупљача смећа: Можете подесити прагове за сакупљање смећа користећи гц.сет_тхресхолд() функција. Ово вам омогућава да ручно подесите прагове за различите генерације што може утицати на учесталост сакупљања смећа.  Пример:

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

Излаз
(500 5 5) 

Предности и недостаци 

Хајде да истражимо неке од предности и недостатака Питхоновог сакупљања смећа.

Предности

Недостаци

Аутоматско управљање меморијом

Може увести додатне трошкове

Нема ручног руковања меморијом

Захтева разумевање концепата памћења

Ефикасно чишћење кроз генерације

Ограничена контрола времена ГЦ-а

Прилагодљива подешавања ГЦ-а

Могућност грешака или цурења меморије

Креирај квиз