logo

Збірка сміття в Python

Вивіз сміття в Python це автоматичний процес, який обробляє виділення та звільнення пам’яті, забезпечуючи ефективне використання пам’яті. На відміну від таких мов, як C або 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 

Пояснення:

  • х містить і і і містить x .
  • Навіть після видалення x і і 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 

Пояснення:

  • де весело (я) створює циклічне посилання шляхом створення словникового посилання.
  • gc.collect() запускає збір сміття та зберігає кількість зібраних об’єктів (спочатку 0).
  • для i в діапазоні (10) дзвінки весело (я) 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 видаляє посилання на а б і в що робить їх придатними для збору сміття.
  • gc.collect() примусово збирає сміття, щоб звільнити пам'ять шляхом очищення об'єктів без посилань.

Вимкнення збирання сміття

У Python збирач сміття запускається автоматично, щоб очистити об’єкти, на які не посилаються. Щоб запобігти його запуску, ви можете вимкнути його за допомогою gc.disable() із модуля gc. приклад:

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

Пояснення:

  • gc.disable() вимикає автоматичний збір сміття.
  • gc.enable() знову вмикає автоматичний збір сміття.

Взаємодія зі збирачем сміття Python

Вбудований механізм під назвою збірник сміття Python автоматично видаляє об’єкти, на які більше немає посилань, щоб звільнити пам’ять і зупинити витоки пам’яті. Модуль Python gc пропонує декілька способів взаємодії зі збирачем сміття, який часто виконується автоматично.

1. Увімкнення та вимкнення збирача сміття: Ви можете ввімкнути або вимкнути збирач сміття за допомогою gc. enable() і gc. відключити() функції відповідно. приклад :

іменування для java
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

Можливість помилок або витоку пам'яті

Створіть вікторину