Сборка мусора (garbage collection) в Python

Поделиться
HTML-код
  • Опубликовано: 2 июн 2024
  • Сборка мусора это важная часть любого языка с автоматическим управлением памяти, и в python она очень типичная. Разобравшись с Python, вы будете иметь хорошее представление о том, как такие алгоритмы вообще работают, и как их можно модифицировать.
    Группа в тг, где я даю дополнительный контекст для моих видео и несмешно шучу - t.me/PythonClinicChnl
    Таймкоды:
    00:00 - интро
    00:30 - подсчёт ссылок
    06:01 - конец?
    06:15 - циклические ссылки
    12:35 - доп инфраструктура объектов
    14:59 - "относительно простой пример"
    22:46 - первая фаза сборки
    26:29 - вторая фаза сборки
    31:11 - автоматизация и поколения
    39:35 - как повлиять на процесс сборки
    42:30 - конец

Комментарии • 24

  • @user-nu3ot7td1j
    @user-nu3ot7td1j 9 месяцев назад +2

    обычно если видео идет 42 минуты, по ощущениям оно идет 42 минуты, здесь было ощущение, что прошло всего 5 минут. Очень интересно объяснено, спасибо.

    • @pythonclinic
      @pythonclinic  9 месяцев назад +2

      это прямо лучший комплимент, спасибо

  • @user-ip8gu1uh6u
    @user-ip8gu1uh6u 5 месяцев назад

    Классно объяснил всё, спасибо!

  • @sokolovjek
    @sokolovjek Год назад

    Спасибо!

  • @ger_Kringe
    @ger_Kringe Год назад +1

    Кайфанул от названия канала!)))

  • @MrLotrus
    @MrLotrus Год назад +1

    🐆

  • @user-jk1gd5oz8c
    @user-jk1gd5oz8c 6 месяцев назад

    Чел, ты лучший 👍

  • @glukis7970
    @glukis7970 11 месяцев назад

    Хм, если модуль ссылается на все объекты то как эти объекты очищаются, ведь даже link_4 должен будет иметь внешнею ссылку?

    • @pythonclinic
      @pythonclinic  11 месяцев назад

      ссылка модуля по-умолчанию циклическая, поэтому её "разрушает" сборщик

  • @MrLotrus
    @MrLotrus Год назад

    А как всё-таки на уровне C удаляются объекты, у которых ref_count=0? Для этого ведь тоже некий алгоритм должен быть. С из коробки ведь не удаляет объекты динамически.

    • @MrLotrus
      @MrLotrus Год назад

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

    • @pythonclinic
      @pythonclinic  Год назад

      да-да, там просто вызов деструктора, вообще в рамках архитектуры CPython считается, что все ссылки контролируются, и можно дополнительно не проверять, если реф каунт 0, то можно уничтожать

    • @user-pg8ry1tm3t
      @user-pg8ry1tm3t 4 месяца назад

      @@MrLotrusтам скорее всего обычный указатель, сырой, и работа идёт на уровне malloc free…

  • @user-pg8ry1tm3t
    @user-pg8ry1tm3t 4 месяца назад

    Что такое ссылка в питоне? Это сишный указатель?..

    • @pythonclinic
      @pythonclinic  4 месяца назад +1

      на самом низком уровне - да, ссылка сводится к указателю

  • @KhimichVladyslav
    @KhimichVladyslav Год назад +1

    З нетерпінням чекаю інфи по threading, multiprocessing, asyncio! GL!

    • @pythonclinic
      @pythonclinic  Год назад +2

      у аўторак будзе пачатак серыі аб паралельным праграмаванні)

    • @KhimichVladyslav
      @KhimichVladyslav Год назад

      @@pythonclinic друг, это был украинский :)
      Енивей, спасибо большое)))

    • @pythonclinic
      @pythonclinic  Год назад

      хахаха, я знаю, но я-то белорус) мы можем общаться на своих языках)

    • @KhimichVladyslav
      @KhimichVladyslav 11 месяцев назад +1

      @@pythonclinic за то что ты бяларус - отдельное уважение)

  • @carbon2409
    @carbon2409 2 месяца назад

    1. Что-то я не совсем догоняю, почему когда вы создаете экземпляры класса Link, не присваиваете обязательные атрибуты next (в частности link_3 и link_4). Вы делаете это после "создания" объекта экземпляра класса (по сути он и не должен будет создаваться из-за ошибки). Либо вы этим пренебрегли в учебных целях, либо вы забыли написать default значение next в методе __init__?
    2. А что именно удаляет объекты из кучи, когда их счетчик ссылок равен нулю? Раньше я думал этим как раз таки занимается сборщик мусора, но теперь понял, что garbage collector лишь взаимодействует с объектами, у которых возможны циклические ссылки.
    3. А как питон понимает, что на объект больше НЕ БУДЕТ ссылаться ни одна переменная? Вот он построчно проходит интерпретацию, видит, что на объект в моменте нет ссылок, соответственно уничтожает объект. Но тут вдруг в будущем появляется снова этот объект. Он создаст новый объект или есть какой-то хитрый механизм, что питон знает, что этот объект будет использоваться в будущем? Либо я что-то упустил в алгоритме интерпретации, возможно там виртуальная машина питона с байт кодом что-то чудит :)

    • @pythonclinic
      @pythonclinic  2 месяца назад

      1. my bad, там просто не видно за границей экрана, что у параметра next есть значение по-умолчанию None
      2. вообще сборщик мусора тригерит деструктор у удаляемого объекта, и потом "забирает" оставшуюся память, тут как посмотреть, можно сказать и что gc удаляет объекты, и что они сами себя удаляют)
      3. ну да, будущее питон не знает, потэтому просто удаляет объекты сразу же, как только на них нету ссылок, если потом появится тапкой же объект - он будет создан заново (есть несколько всяких трюков типа интернации строк, которые помогают экономить память в таких ситуациях тоже, а вообще компилируемые языки обычно умеют такие ситуации "предвидеть", но достаточно ограничено, насколько хватит глубины анализа кода)

  • @KhimichVladyslav
    @KhimichVladyslav Год назад +1

    Дякую за контент! Чекаю більше корисної інфи!