Управление памятью в python
В отличие от некоторых других языков, в питоне программист не сильно задумывается о работе с памятью. Как минимум до того момента, как память не становится узким местом в программе. Поговорим о том, как работает сборщик мусора в python.
Я в Telegram - t.me/tricky_python
Канал создан при поддержке сообщества Moscow Python.
Наш KZread-канал - / @moscowdjangoru
Курсы Learn Python - learn.python.ru/
Пікірлер: 37
Благодарю! Наглядно, полезно, понятно. Да, нужно больше контента по Python и CPython
Ваш канал что-то с чем-то. Спасибо вам большое)
Пришел по названию :) надеялся увидеть нативное управление памятью в python :)
Спасибо за видео! Хотелось бы еще контента на эту тему
@user-th6xg5bk4c
3 жыл бұрын
В планах есть еще несколько видео про память, но пока без конкретной даты релиза )
@benkubbb785
3 жыл бұрын
точно точно
благодарю ) четко и ясно!
Годнота. Рад что нашел, как раз то, что нужно
Классная тема и подача!!
Спасибо!
У меня недавно на практике в сервисе память текла нещадно, собственно не в первый раз уже. В целом ситуация стандартная - при работе демона постоянно вызываются функции, которые порождают большие промежуточные результаты в виде списков/очередей/словарей. При выходе из контекста эти объекты либо вообще не удаляются, либо удаляются через много времени. Удаление самих локальных переменных перед выходом из функции ничего на даёт. Но проблема обычно решается очисткой содержимого в коллекции, например есть есть метод clear. Честно говоря, я затрудняюсь объяснить почему список с кортежами интерпретатором не удаляется, но после ручной очистки всё становится нормально. Так удалось сократить средний расход памяти с 1,5 ГБ до 17 МБ :)
@Army_of_Earth
2 жыл бұрын
Тут я могу ошибаться (заодно поправите, если узнали сами за все это время), но вроде как есть два типа сборки мусора: 1) Список со ссылками на объекты, 2) Сборщик мусора (опциональный), который чистит ссылки друг на друга, т.е. в случае, если первый объект ссылается на другой, а тот на первый, но на них больше ничто не ссылается, то это работа для сборщика. Проблема в том, что сборщие запускается, только когда некий объем памяти, отведенный для работы данного процесса Питона превысит некие рамки. До этого такие связанные объекты будут лежать в памяти. Можно уменьшить размер той самой памяти для процесса и сборщик будет запускаться чаще.
@prod_iliak
Жыл бұрын
у меня такая же ситуация, только проблема в том что функция возвращает список, как тогда в таком случае его очистить?
@user-dy4nj1cd2d
Жыл бұрын
@@prod_iliak возвращает новый экземпляр или каждый раз один и тот же?
@prod_iliak
Жыл бұрын
@@user-dy4nj1cd2d один и тот же
@prod_iliak
Жыл бұрын
@@user-dy4nj1cd2d проблему я решил, но немного некорректно. Просто запускаю py файл через другой py файл с помощью while True: os.system(main.py)
Спасибо.
ну еще не хватает что больше занимает куда даду класть, словарь, список , нп-вектор, нп-массив, пандас?
А чего перестали снимать новые видеоролики?
Здравствуйте, Михаил. Спасибо за отличный материал! Расскажите пожалуйста, почему 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
3 жыл бұрын
Это называется string interning - одна из оптимизаций инетрпритатора. Совсем в деталях не вспомню, но это трюк работает с достаточно короткими строками содержащими латиницу, цифры и кажется подчеркивание, из-за чего x = 'ob-ject' y = 'ob-ject' print(x is y) даст False У меня есть в планах несколько материалов про подобные оптимизаци, там тема интересная
@koolbasov
3 жыл бұрын
@@user-th6xg5bk4c, спасибо большое! =)
@alexanderivanov899
Жыл бұрын
Потому что пайтон интернирует(предварительно создает) объекты: Целые числа в диапазоне от -5 до 256. Строки (до 20 символов), содержащие только ASCII-буквы, цифры или знаки подчёркивания.
@koolbasov
Жыл бұрын
@@alexanderivanov899 спасибо!
Вопрос по смежной теме. Поясните, пожалуйста - почему одни и те же инструкции выдают разный результат в зависимости от того, написаны они в скрипте и затем запущены, или в консоли. Инструкции: a = 500 b = 500 print(id(a), id(b)) Если написать в скрипте *.py и потом запустить, результат - одинаковые id. Если писать в консоли - разные. Моё понимание такое: Создаются 2 разных (!) объекта, со значениями 500. На первый указывает ссылка a, на второй указывает ссылка b. По идее id должны быть разные. При выполнении в скрипте неизменяемые типы данных как-то кешируются и не создаются повторно с такими же значениями, или как это работает?
@Vasile4e4ek
2 жыл бұрын
Прошло пол года, есть решение?
@andyanderson222
2 жыл бұрын
@@Vasile4e4ek Неа, но в сущности с неизменяемыми объектами это и не важно, одинаковые у них id, или разные - все равно с ними сделать ничего нельзя. Решите, скажем, увеличить на единицу, создастся другой объект, и ссылка перепишется. Какая-то внутренняя оптимизация, которая для пользователя ни на что не влияет. Такие вещи имеют значения с изменяемыми объектами, но там всё без сюрпризов.
@archyt88
2 жыл бұрын
Ну в консоли свое пространствово имен различное с скриптом, возможно поэтому оно резервирует их под разные области в памяти
С уважением к автору, но нужно было добавить, что это два разных механизма, работающих отдельно: 1. Подсчёта ссылок и 2. Garbage Collection. При чём gc можно отключать если нужно.
@user-th6xg5bk4c
3 жыл бұрын
Я решил, что в вводном видео нужно лезть в детали по минимуму - чтобы человек просмотрев составил общее представление. Отключение gc в общем случае - так себе идея. Вот это "можно отключить если нужно" на практике означает следующее - если человеку это и правда нужно, то он в курсе.
@FoodMaks
3 жыл бұрын
@@user-th6xg5bk4c, спасибо. Согласен с вами. Мне нравятся ваши мини уроки. Продолжайте в том же духе.
@user-th6xg5bk4c
3 жыл бұрын
@@FoodMaks Спасибо, очень приятно!
Глобальные переменные это в принципе антипаттерн. Если тебе нужны глобальные переменные, значит ты делаешь что-то не так.
@user-dy4nj1cd2d
3 жыл бұрын
Это просто инструмент. Если им аккуратно пользоваться, всё будет нормально
10 минут и так мало инфо?!