Управление памятью в Python

Поділитися
Вставка
  • Опубліковано 10 лип 2024
  • В этом видео я постараюсь максимально просто объяснить, как работает управление памятью (memory management) в Python. Ну и конечно без схем не обошлось)
    Канал в тг - t.me/PythonClinicChnl
    Таймкоды:
    00:00 - интро
    00:55 - стэк и куча
    08:16 - арены
    10:42 - пулы
    11:26 - блоки
    18:04 - выводы
    19:59 - аутро

КОМЕНТАРІ • 43

  • @MrLotrus
    @MrLotrus Рік тому +15

    Вот контента такой глубины в русскоязычном Ютубе очень не хватает. Спасибо ❤

  • @user-kk9sp2ln6x
    @user-kk9sp2ln6x Рік тому +6

    Формат бомба.) Информация заходит чётко.
    Теперь есть более глубокое представление об автоматизации работы с памятью в python.
    Жду видео о ссылках и объектах!)

    • @pythonclinic
      @pythonclinic  Рік тому +1

      и оно таки будет на следующей неделе) спасибо)

  • @user-tt9hx4kh1e
    @user-tt9hx4kh1e 4 дні тому

    отличное объяснение

  • @sergekhalimovskyy5467
    @sergekhalimovskyy5467 10 місяців тому +2

    19:23 Это наверное самое смешное что я слышал за последние годы про утечку. Мало кто поймет..

  • @heybeachMIN
    @heybeachMIN 8 місяців тому +1

    Блин у меня "куча" ассоциируется с гером фильма ;)
    А вообще видео очень хорошее, стало намного понятней как работает память в python, хоть я и новичок в программировании.
    Спасибо!

  • @cortexor1
    @cortexor1 Рік тому +1

    Супер! Спасибо за качественны и понятный материал!

  • @eXcroll
    @eXcroll Рік тому

    молодец, хорошее объяснение такой сложной темы👍

  • @TrueSentiago
    @TrueSentiago 7 місяців тому

    Крутое объяснение материала! Спасибо!

  • @nehz_ttv
    @nehz_ttv Місяць тому

    3 раза поспал, спасибо)

  • @user-kb8nl1vz1i
    @user-kb8nl1vz1i 4 місяці тому

    Спасибо за объяснение, вполне доходчиво

  • @fichtensaft5149
    @fichtensaft5149 8 місяців тому

    Отличное видео, посмотрел с удовольствием

  • @user-ry2xj2yy7q
    @user-ry2xj2yy7q 11 місяців тому

    супер просто и понятно. Ставлю лайк)

  • @programming_etc
    @programming_etc 9 місяців тому

    Годный видос, не смотря на то что особо никогда не заморачивался с памятью в python из-за встроенного инструментария по её организации, всё равно интеересно послушать как это всё работает под капотом. Много нового для себя узнал). Интересно было бы посмотреть видео похожего формата где бы на низком уровне объяснялись генераторы)

  • @user-sr3mr8zq7i
    @user-sr3mr8zq7i 7 місяців тому

    Супер! Огромное спасибо!

  • @user-zu2sy2lq6t
    @user-zu2sy2lq6t Рік тому

    randomly found your channel, very useful

  • @evgenyzakiev693
    @evgenyzakiev693 Рік тому +1

    От babushki спасибо:)))

  • @user-mb9ml5hn9u
    @user-mb9ml5hn9u 9 місяців тому

    Привет, классный контент,но мне все еще не дают покоя эти вопросы
    1)Почему в python мы не храним объекты с неизменяемым типом данных в stack,как в си ,ведь мы знаем их размер?
    2)В 1 блоке может быть только 1 объект?
    3)Как интерпретатор понимает какой размер объекта,есть ли для базовых неизменяемых,для изменяемых типов заданные значения(int=8б)? если изменяемый тип становиться больше блока ,я так понимаю он выносит его в блок с большем размером

    • @pythonclinic
      @pythonclinic  9 місяців тому +2

      ох, интересные вопросы, попробую аккуратно ответить:
      1) свечку не держал, но предположу, что такая архитектура придумана для гибкости работы со всеми объектами по ссылке, грубо говоря ко всем объектам применяются одинаковые стандарты подсчёта ссылок и отправления их в последний путь
      2) в теории да, если он прям огромный
      3) заданных значений нет, объекты в теории прям бесконечно большие, но есть такой момент, что изменяемые объекты меняться не могут, поэтому мы их размер один раз при создании вычисляем и на этом успокаиваемся, а изменяемые объекты это всегда наборы ссылок, которые в свою очередь могут ссылаться либо на неизменяемые (размер которых мы знаем), либо на изменяемые, которые тоже суть наборы ссылок и так до конца, пока по всем ссылкам мы не упрёмся либо в неизменяемые, либо в пустые объекты, и тогда для изменяемых объектов достаточно просто пройти по всем ссылкам и посчитать размер всего, что мы встретим на своём пути (но интерпретатор этого не делает вообще говоря, ему не нужно, потому что важно разложить в памяти именно неизменяемые объекты, и для них знать размер, а всякие списки это всего лишь оболочки пусть и со своей логикой хранения внутри, но всё равно там только ссылки в основном, их размер фиксирован и относительно мал)

  • @IPClimber
    @IPClimber 4 місяці тому

    Спасибо, коллега! Хотелось задать несколько вопроса:
    1. Указатель freeblock есть , а указатель untoched нет? Почему вообще их учитывают раздельно?
    2. Как думаешь, почему partially full арену/пул нельзя отдать OS? Ведь память на современных системах - виртуальная, и можно просто размаппить неиспользованный кусок(предположение - маппится contiguous region , и если отмаппить его кусочек, туда всё равно ничего не влезет, те фрагментация на уровне физической памяти )
    3. Есть ли какие-то предпочтения по группировке? Например, хранить элементы массива рядом с самим массивом (который, как известно, хранит только ссылки на содержимое)
    Спасибо за интересную тему!

    • @pythonclinic
      @pythonclinic  4 місяці тому

      1. есть и untouched, но он не настолько интересен, freeblock позволяет переиспользовать "арендованную" память, это чаще всего важнее, чем использовать новую, и поэтому их учитывают отдельно, экономия на всём и всегда
      2. соглашусь, что в теории такая операция возможна, но на практике она была бы досточно "дорогой" для самой os + не совсем понятно, в какой именно момент отдавать кусок неиспользованной арены обратно, нужно быть прям уверенным, что оно больше не понадобится, а это возможно только если программа завершена, но в этом случае всё отдадим и так
      3. нет, по умолчанию нет, потому что предпологается, что обращение по ссылке происходит за постоянное время, но в некоторых ситуациях своего рода группировка реализуется специально, например для массивов numpy, а в некоторых она возникает сама (если объекты улетают в один пул)

    • @IPClimber
      @IPClimber 4 місяці тому

      @@pythonclinic спасибо за ответ! Насчёт константного доступа: в случае кэширования есть разница)

  • @dmitry-lz1ny
    @dmitry-lz1ny Рік тому +2

    Очень полезная информация. Такие темы чаще всего игнорятся создателями контента по питону.
    А как такую тему сделать на diagrams?

    • @pythonclinic
      @pythonclinic  Рік тому +3

      В опциях диаграмы включить Sketch

  • @user-dk4cx9mw5g
    @user-dk4cx9mw5g Рік тому

    Очень интересно! Спасибо! Менеджер так работает только в CPython или в других интерпретаторах тоже?

    • @pythonclinic
      @pythonclinic  Рік тому

      Похожие концепции используются в большинстве языков с автоматическим управлением памятью, но они все различаются в деталях, иногда очень сильно, например, в C# тоже есть стэк и куча, но в обоих будут храниться прям живые объекты, а переменные будут существовать вообще отдельно

  • @sladge17
    @sladge17 Рік тому

    Отличный ролик, здорово, что делаешь не очередной курс по основам python, а копаешь глубже. Но после просмотра появилась пара вопросов которые не раскрыты в видео:
    1. Как определяется велечина блока в пуле? Насколько я знаю она определяется при первом заполнении свободного пула велечиной равной или большей велечине объекта который мы хотим положить в пул, а далее весь пул заполняется блоками равного размера. Но могу ошибаться.
    2. Что происходит если велечина объекта превышает велечину пула? Что происходит если велечина объекта превышает велечину арены?

    • @pythonclinic
      @pythonclinic  Рік тому +3

      Спасибо за отличные вопросы, разбираемся:
      1. Идея верная, размер блоков в пуле подстраивается под первый добавленный объект, но при этом размеры блоков заранее предопределены - 8, 16, 24, 32, 40, ... , 512 байт. Из этих размеров выбирается минимальный, в который влезет новый объект.
      2. В таких случаях будет работать совершенно другой механизм выделения памяти, если объект не влезает в пул, и его нельзя разбить на части и как-то эти части связать, то pvm попытается спихнуть ответственность на операционную систему, которая конечно же справится с этой задачей, если у неё самой будет достаточно памяти "на руках". Это, очевидно, очень плохой сценарий, так как этот объект выпадает из стандартного флоу управления памятью, и приводит к дополнительной фрагментации памяти на уровне операционной системы.

    • @sladge17
      @sladge17 Рік тому

      @@pythonclinic Спасибо за подробный ответ.

  • @annonymous8220
    @annonymous8220 Рік тому

    мы можем как то практически применять знание о распределении памяти ? Как то положительно влиять на это, если этот процесс автоматизирован?

    • @pythonclinic
      @pythonclinic  Рік тому

      процесс полностью автоматический, мы можем немного на него влиять через модуль gc (сборщик мусора), а ещё мы можем сделать некоторые выводы о работе с объектами в памяти, я расскажу об этом в дополнительных видео

  • @andreydubrov5562
    @andreydubrov5562 Рік тому

    Формат хороший, но экологично и экономично это все-таки разные понятия)

    • @pythonclinic
      @pythonclinic  Рік тому +1

      экологично, потому что уже выделенная память переиспользуется

  • @user-zb5wh1zh8d
    @user-zb5wh1zh8d Рік тому

    Не подскажите, как сделали такую визуализацию в draw io? Не нашел в стандартных настройках =/

    • @pythonclinic
      @pythonclinic  Рік тому

      В настройках диаграммы нужно включить параметр sketch

  • @MrSunTrope
    @MrSunTrope 2 місяці тому

    А если объект 1мб он поделится на 4 арены? как произойдёт запись?

    • @pythonclinic
      @pythonclinic  Місяць тому

      не, не поделится, большинство объектов в пайтон относятся к сложно устроенным ссылочным типам данных, части которых не будут превышать лимит и они будут хранится в разных аренах

  • @qrthack3233
    @qrthack3233 6 місяців тому

    Можно узнать откуда черпал инфу?)

    • @pythonclinic
      @pythonclinic  6 місяців тому

      никаких секретов, это документация и исходный код Python)

  • @9564519
    @9564519 Рік тому

    утекать память будет автоматически XDDD

  • @kohakovich
    @kohakovich 10 місяців тому

    Grazia Signore.