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

Поділитися
Вставка
  • Опубліковано 8 лют 2021
  • В отличие от некоторых других языков, в питоне программист не сильно задумывается о работе с памятью. Как минимум до того момента, как память не становится узким местом в программе. Поговорим о том, как работает сборщик мусора в python.
    Я в Telegram - t.me/tricky_python
    Канал создан при поддержке сообщества Moscow Python.
    Наш UA-cam-канал - / @moscowdjangoru
    Курсы Learn Python - learn.python.ru/

КОМЕНТАРІ • 37

  • @dalerkhalilov9440
    @dalerkhalilov9440 3 роки тому

    Ваш канал что-то с чем-то. Спасибо вам большое)

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov 9 місяців тому

    Благодарю! Наглядно, полезно, понятно. Да, нужно больше контента по Python и CPython

  • @oleg_kishinskii
    @oleg_kishinskii 3 роки тому +4

    Пришел по названию :) надеялся увидеть нативное управление памятью в python :)

  • @nazarbektajibaev6405
    @nazarbektajibaev6405 2 роки тому

    благодарю ) четко и ясно!

  • @alexandersmirnov4274
    @alexandersmirnov4274 2 роки тому

    Классная тема и подача!!

  • @johnconnor7778
    @johnconnor7778 3 роки тому +6

    Спасибо за видео! Хотелось бы еще контента на эту тему

    • @user-th6xg5bk4c
      @user-th6xg5bk4c  3 роки тому +3

      В планах есть еще несколько видео про память, но пока без конкретной даты релиза )

    • @benkubbb785
      @benkubbb785 3 роки тому

      точно точно

  • @klimm.2935
    @klimm.2935 Рік тому

    Годнота. Рад что нашел, как раз то, что нужно

  • @bluxer4225
    @bluxer4225 3 роки тому +1

    Спасибо!

  • @user-dy4nj1cd2d
    @user-dy4nj1cd2d 3 роки тому +5

    У меня недавно на практике в сервисе память текла нещадно, собственно не в первый раз уже. В целом ситуация стандартная - при работе демона постоянно вызываются функции, которые порождают большие промежуточные результаты в виде списков/очередей/словарей. При выходе из контекста эти объекты либо вообще не удаляются, либо удаляются через много времени. Удаление самих локальных переменных перед выходом из функции ничего на даёт. Но проблема обычно решается очисткой содержимого в коллекции, например есть есть метод clear. Честно говоря, я затрудняюсь объяснить почему список с кортежами интерпретатором не удаляется, но после ручной очистки всё становится нормально. Так удалось сократить средний расход памяти с 1,5 ГБ до 17 МБ :)

    • @Army_of_Earth
      @Army_of_Earth 2 роки тому

      Тут я могу ошибаться (заодно поправите, если узнали сами за все это время), но вроде как есть два типа сборки мусора: 1) Список со ссылками на объекты, 2) Сборщик мусора (опциональный), который чистит ссылки друг на друга, т.е. в случае, если первый объект ссылается на другой, а тот на первый, но на них больше ничто не ссылается, то это работа для сборщика. Проблема в том, что сборщие запускается, только когда некий объем памяти, отведенный для работы данного процесса Питона превысит некие рамки. До этого такие связанные объекты будут лежать в памяти. Можно уменьшить размер той самой памяти для процесса и сборщик будет запускаться чаще.

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

      у меня такая же ситуация, только проблема в том что функция возвращает список, как тогда в таком случае его очистить?

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

      @@prod_iliak возвращает новый экземпляр или каждый раз один и тот же?

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

      @@user-dy4nj1cd2d один и тот же

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

      @@user-dy4nj1cd2d проблему я решил, но немного некорректно. Просто запускаю py файл через другой py файл с помощью while True: os.system(main.py)

  • @zakchips
    @zakchips 2 роки тому

    Спасибо.

  • @koolbasov
    @koolbasov 3 роки тому +7

    Здравствуйте, Михаил. Спасибо за отличный материал! Расскажите пожалуйста, почему Python вот так по разному обрабатывает переменные с латиницей и кириллицей или подскажите где про это можно почитать:
    >>> 'объект' is 'объект'
    True
    >>> 'object' is 'object'
    True
    >>> x = 'object'
    >>> y = 'object'
    >>> a = 'объект'
    >>> b = 'объект'
    >>> x is y
    True
    >>> a is b
    False
    >>>
    >>> id(x)
    2581302373488
    >>> id(y)
    2581302373488
    >>> id(a)
    2581343335904
    >>> id(b)
    2581343465744
    >>>

    • @user-th6xg5bk4c
      @user-th6xg5bk4c  3 роки тому +7

      Это называется string interning - одна из оптимизаций инетрпритатора. Совсем в деталях не вспомню, но это трюк работает с достаточно короткими строками содержащими латиницу, цифры и кажется подчеркивание, из-за чего
      x = 'ob-ject'
      y = 'ob-ject'
      print(x is y)
      даст False
      У меня есть в планах несколько материалов про подобные оптимизаци, там тема интересная

    • @koolbasov
      @koolbasov 3 роки тому +2

      @@user-th6xg5bk4c, спасибо большое! =)

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

      Потому что пайтон интернирует(предварительно создает) объекты:
      Целые числа в диапазоне от -5 до 256.
      Строки (до 20 символов), содержащие только ASCII-буквы, цифры или знаки подчёркивания.

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

      @@alexanderivanov899 спасибо!

  • @andyanderson222
    @andyanderson222 2 роки тому

    Вопрос по смежной теме. Поясните, пожалуйста - почему одни и те же инструкции выдают разный результат в зависимости от того, написаны они в скрипте и затем запущены, или в консоли. Инструкции:
    a = 500
    b = 500
    print(id(a), id(b))
    Если написать в скрипте *.py и потом запустить, результат - одинаковые id.
    Если писать в консоли - разные.
    Моё понимание такое:
    Создаются 2 разных (!) объекта, со значениями 500. На первый указывает ссылка a, на второй указывает ссылка b. По идее id должны быть разные. При выполнении в скрипте неизменяемые типы данных как-то кешируются и не создаются повторно с такими же значениями, или как это работает?

    • @Vasile4e4ek
      @Vasile4e4ek 2 роки тому

      Прошло пол года, есть решение?

    • @andyanderson222
      @andyanderson222 2 роки тому

      @@Vasile4e4ek Неа, но в сущности с неизменяемыми объектами это и не важно, одинаковые у них id, или разные - все равно с ними сделать ничего нельзя. Решите, скажем, увеличить на единицу, создастся другой объект, и ссылка перепишется. Какая-то внутренняя оптимизация, которая для пользователя ни на что не влияет.
      Такие вещи имеют значения с изменяемыми объектами, но там всё без сюрпризов.

    • @archyt88
      @archyt88 2 роки тому

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

  • @vendjin
    @vendjin 2 роки тому +1

    А чего перестали снимать новые видеоролики?

  • @dicloniusN35
    @dicloniusN35 5 місяців тому

    ну еще не хватает что больше занимает куда даду класть, словарь, список , нп-вектор, нп-массив, пандас?

  • @FoodMaks
    @FoodMaks 3 роки тому

    С уважением к автору, но нужно было добавить, что это два разных механизма, работающих отдельно: 1. Подсчёта ссылок и 2. Garbage Collection. При чём gc можно отключать если нужно.

    • @user-th6xg5bk4c
      @user-th6xg5bk4c  3 роки тому +2

      Я решил, что в вводном видео нужно лезть в детали по минимуму - чтобы человек просмотрев составил общее представление. Отключение gc в общем случае - так себе идея. Вот это "можно отключить если нужно" на практике означает следующее - если человеку это и правда нужно, то он в курсе.

    • @FoodMaks
      @FoodMaks 3 роки тому +2

      @@user-th6xg5bk4c, спасибо. Согласен с вами. Мне нравятся ваши мини уроки. Продолжайте в том же духе.

    • @user-th6xg5bk4c
      @user-th6xg5bk4c  3 роки тому +2

      @@FoodMaks Спасибо, очень приятно!

  • @AgeofCreations
    @AgeofCreations 3 роки тому +2

    Глобальные переменные это в принципе антипаттерн. Если тебе нужны глобальные переменные, значит ты делаешь что-то не так.

    • @user-dy4nj1cd2d
      @user-dy4nj1cd2d 3 роки тому

      Это просто инструмент. Если им аккуратно пользоваться, всё будет нормально

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

    10 минут и так мало инфо?!