Тёмный
No video :(

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

Хитрый питон
Подписаться 9 тыс.
Просмотров 19 тыс.
50% 1

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

Опубликовано:

 

28 авг 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 37   
@oleg_kishinskii
@oleg_kishinskii 3 года назад
Пришел по названию :) надеялся увидеть нативное управление памятью в python :)
@johnconnor7778
@johnconnor7778 3 года назад
Спасибо за видео! Хотелось бы еще контента на эту тему
@user-th6xg5bk4c
@user-th6xg5bk4c 3 года назад
В планах есть еще несколько видео про память, но пока без конкретной даты релиза )
@benkubbb785
@benkubbb785 3 года назад
точно точно
@Dmitrii-Zhinzhilov
@Dmitrii-Zhinzhilov 10 месяцев назад
Благодарю! Наглядно, полезно, понятно. Да, нужно больше контента по Python и CPython
@user-dy4nj1cd2d
@user-dy4nj1cd2d 3 года назад
У меня недавно на практике в сервисе память текла нещадно, собственно не в первый раз уже. В целом ситуация стандартная - при работе демона постоянно вызываются функции, которые порождают большие промежуточные результаты в виде списков/очередей/словарей. При выходе из контекста эти объекты либо вообще не удаляются, либо удаляются через много времени. Удаление самих локальных переменных перед выходом из функции ничего на даёт. Но проблема обычно решается очисткой содержимого в коллекции, например есть есть метод 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)
@dalerkhalilov9440
@dalerkhalilov9440 3 года назад
Ваш канал что-то с чем-то. Спасибо вам большое)
@klimm.2935
@klimm.2935 Год назад
Годнота. Рад что нашел, как раз то, что нужно
@alexandersmirnov4274
@alexandersmirnov4274 2 года назад
Классная тема и подача!!
@nazarbektajibaev6405
@nazarbektajibaev6405 2 года назад
благодарю ) четко и ясно!
@bluxer4225
@bluxer4225 3 года назад
Спасибо!
@koolbasov
@koolbasov 3 года назад
Здравствуйте, Михаил. Спасибо за отличный материал! Расскажите пожалуйста, почему 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 2 года назад
Потому что пайтон интернирует(предварительно создает) объекты: Целые числа в диапазоне от -5 до 256. Строки (до 20 символов), содержащие только ASCII-буквы, цифры или знаки подчёркивания.
@koolbasov
@koolbasov 2 года назад
@@alexanderivanov899 спасибо!
@dicloniusN35
@dicloniusN35 6 месяцев назад
ну еще не хватает что больше занимает куда даду класть, словарь, список , нп-вектор, нп-массив, пандас?
@FoodMaks
@FoodMaks 3 года назад
С уважением к автору, но нужно было добавить, что это два разных механизма, работающих отдельно: 1. Подсчёта ссылок и 2. Garbage Collection. При чём gc можно отключать если нужно.
@user-th6xg5bk4c
@user-th6xg5bk4c 3 года назад
Я решил, что в вводном видео нужно лезть в детали по минимуму - чтобы человек просмотрев составил общее представление. Отключение gc в общем случае - так себе идея. Вот это "можно отключить если нужно" на практике означает следующее - если человеку это и правда нужно, то он в курсе.
@FoodMaks
@FoodMaks 3 года назад
@@user-th6xg5bk4c, спасибо. Согласен с вами. Мне нравятся ваши мини уроки. Продолжайте в том же духе.
@user-th6xg5bk4c
@user-th6xg5bk4c 3 года назад
@@FoodMaks Спасибо, очень приятно!
@zakchips
@zakchips 2 года назад
Спасибо.
@andyanderson222
@andyanderson222 3 года назад
Вопрос по смежной теме. Поясните, пожалуйста - почему одни и те же инструкции выдают разный результат в зависимости от того, написаны они в скрипте и затем запущены, или в консоли. Инструкции: 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 года назад
А чего перестали снимать новые видеоролики?
@AgeofCreations
@AgeofCreations 3 года назад
Глобальные переменные это в принципе антипаттерн. Если тебе нужны глобальные переменные, значит ты делаешь что-то не так.
@user-dy4nj1cd2d
@user-dy4nj1cd2d 3 года назад
Это просто инструмент. Если им аккуратно пользоваться, всё будет нормально
@soyuzbekorozbekuulu6346
@soyuzbekorozbekuulu6346 Год назад
10 минут и так мало инфо?!
Далее
Что такое __name__  в Python?
6:59
Просмотров 11 тыс.
журавли в пятницу
00:14
Просмотров 71 тыс.
Garbage Collection in Python: Speed Up Your Code
16:41