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

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

Пікірлер: 37

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov7 ай бұрын

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

  • @dalerkhalilov9440
    @dalerkhalilov94403 жыл бұрын

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

  • @oleg_kishinskii
    @oleg_kishinskii3 жыл бұрын

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

  • @johnconnor7778
    @johnconnor77783 жыл бұрын

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

  • @user-th6xg5bk4c

    @user-th6xg5bk4c

    3 жыл бұрын

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

  • @benkubbb785

    @benkubbb785

    3 жыл бұрын

    точно точно

  • @nazarbektajibaev6405
    @nazarbektajibaev64052 жыл бұрын

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

  • @klimm.2935
    @klimm.2935 Жыл бұрын

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

  • @alexandersmirnov4274
    @alexandersmirnov42742 жыл бұрын

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

  • @bluxer4225
    @bluxer42253 жыл бұрын

    Спасибо!

  • @user-dy4nj1cd2d
    @user-dy4nj1cd2d3 жыл бұрын

    У меня недавно на практике в сервисе память текла нещадно, собственно не в первый раз уже. В целом ситуация стандартная - при работе демона постоянно вызываются функции, которые порождают большие промежуточные результаты в виде списков/очередей/словарей. При выходе из контекста эти объекты либо вообще не удаляются, либо удаляются через много времени. Удаление самих локальных переменных перед выходом из функции ничего на даёт. Но проблема обычно решается очисткой содержимого в коллекции, например есть есть метод 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
    @zakchips2 жыл бұрын

    Спасибо.

  • @dicloniusN35
    @dicloniusN354 ай бұрын

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

  • @user-ux4le1tf3y
    @user-ux4le1tf3y2 жыл бұрын

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

  • @koolbasov
    @koolbasov3 жыл бұрын

    Здравствуйте, Михаил. Спасибо за отличный материал! Расскажите пожалуйста, почему 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 жыл бұрын

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

  • @koolbasov

    @koolbasov

    3 жыл бұрын

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

  • @alexanderivanov899

    @alexanderivanov899

    Жыл бұрын

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

  • @koolbasov

    @koolbasov

    Жыл бұрын

    @@alexanderivanov899 спасибо!

  • @andyanderson222
    @andyanderson2222 жыл бұрын

    Вопрос по смежной теме. Поясните, пожалуйста - почему одни и те же инструкции выдают разный результат в зависимости от того, написаны они в скрипте и затем запущены, или в консоли. Инструкции: 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 жыл бұрын

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

  • @FoodMaks
    @FoodMaks3 жыл бұрын

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

  • @user-th6xg5bk4c

    @user-th6xg5bk4c

    3 жыл бұрын

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

  • @FoodMaks

    @FoodMaks

    3 жыл бұрын

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

  • @user-th6xg5bk4c

    @user-th6xg5bk4c

    3 жыл бұрын

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

  • @arh1mond1NiceGames
    @arh1mond1NiceGames3 жыл бұрын

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

  • @user-dy4nj1cd2d

    @user-dy4nj1cd2d

    3 жыл бұрын

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

  • @soyuzbekorozbekuulu6346
    @soyuzbekorozbekuulu6346 Жыл бұрын

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

Келесі