Эффективно работаем со сложными структурами данных в Python 3.7+

Поделиться
HTML-код
  • Опубликовано: 1 янв 2025

Комментарии • 145

  • @t0digital
    @t0digital  5 лет назад +71

    Подумал, что такая подборка может быть полезна не только нам. Стоит делиться подобным?

    • @КонстантинИбрагимов-т3в
      @КонстантинИбрагимов-т3в 5 лет назад +1

      Обязательно!)

    • @AlexandrStepanov-y4g
      @AlexandrStepanov-y4g 5 лет назад

      А еще если бы в видосе был кейс как Вы к этому пришли и что это дало в реальных показателях на salesbeat.pro

    • @t0digital
      @t0digital  5 лет назад +2

      @@AlexandrStepanov-y4g мы загружаем тарифы служб доставки в нашу систему, это огромный массив данных, который во время работы загрузчика надо держать в оперативной памяти. Конкретный кейс - данные перестали помещаться в RAM на продакшн сервере :)

    • @sorokousov
      @sorokousov 5 лет назад

      А что со скоростью?

    • @t0digital
      @t0digital  5 лет назад

      @@sorokousov со скоростью чего?

  • @metallurg42
    @metallurg42 2 года назад

    Как быстро растет аудитория при условии качественного контента) Спасибо за Ваши видео!

  • @egorkomarov4719
    @egorkomarov4719 5 лет назад +10

    с др!
    Здоровья, любви и денег!

  • @MaPeHuH
    @MaPeHuH 5 лет назад +5

    Поздравляю Вас с днем рождения прошедшим.
    И спасибо за видео! Python тоже интересен!!!

    • @t0digital
      @t0digital  5 лет назад

      Спасибо, Николай!

  • @ВикторКозлов-г6б
    @ВикторКозлов-г6б 2 года назад

    Круто! Спасибо! Будем использовать. Кажется очень полезным, особенно, когда пришёл из строго типизированного языка, вроде C#

  • @andrewslee_channel
    @andrewslee_channel 4 года назад +2

    Очень интересно и наглядно. Спасибо Вам!

  • @andreil174
    @andreil174 4 года назад +3

    Ого, видео вышло 1 год назад, и тогда на канале только стукнуло 2000 подписчиков, а сейчас, в январе 2021, уже 60.6 тысяч! Впечатляющий рост!

  • @ohmygoodness4653
    @ohmygoodness4653 5 лет назад +2

    Очень интересно и полезно, надеюсь на большее количество видео по Python!

    • @t0digital
      @t0digital  5 лет назад

      Спасибо! Будет много по Python - наш основной язык на сегодня. Хотя скоро выходит PHP разработчик и возможно ему тоже будет, что поведать миру:)

  • @PikaCh-t7i
    @PikaCh-t7i 2 года назад

    Храни тебя бог! Это очень актуально и полезно

  • @C0oo1D
    @C0oo1D 5 лет назад +3

    С прошедшим!)
    Даешь разбой, продолжаем уменьшать (не забираясь в базы данных), замена dict на NamedTuple дает 310.1KB:
    class AltDict(NamedTuple):
    city: str
    tariffs: list

    • @t0digital
      @t0digital  5 лет назад

      ТОП! До 310 KB мне не удалось сжать, в моём случае 469 KB github.com/alexey-goloburdin/youtube-python-structures/blob/master/5_best.py

    • @C0oo1D
      @C0oo1D 5 лет назад

      Пробовал еще uuid заменить, даже в стандартной либе есть, но жрут они сильно больше строки.. тут похоже только в ctypes уходить..
      А вот list на tuple заменить забыл, размер резко упал до 262 КБ) Кстати, а почему Tuple из typings? Вроде ж не указаны доп поля, тогда и обычный tuple сойдет.

    • @t0digital
      @t0digital  5 лет назад

      Покажете ваш код?
      Tuple из typing для простановки типов по каждому полю, это удобно для подсказок IDE'шных, когда эти вложенные данные потом обрабатываются

    • @C0oo1D
      @C0oo1D 5 лет назад

      Так я же ничего не менял, это github.com/alexey-goloburdin/youtube-python-structures/blob/master/5_best.py показывает 262 KB. Ну а список 310 KB.
      Кстати, там ведь не tuple на входе, а генератор. Если принудить к tuple - 287 KB.
      L30: tariffs: Generator (из typing) решает проблему :)
      И еще пару заметок - лишний импорт dataclass и нет пустой строки в конце ;)
      По dataclass - в видео сначала используете его, потом нет. Но все работает т.к. начиная с какой-то из последних версий питона (кажется 3.7) при объявлении типов или данных класс автоматически становится dataclass.

  • @mentatij
    @mentatij 5 лет назад +1

    С прошедшим Днем Рождения!
    Насчет 2 тыс - я удивлен ( не обращал внимание на количество подписчиков, но думал у такого канала больше 10к точно!
    Давно пользуюсь namedtuple из collections но просто потому что удобно, никогда не задумывался о занимаемой памяти - наверное просто всегда хватало.

  • @mykytao5028
    @mykytao5028 4 года назад +26

    Есть важная разница между использованием dataclass и NamedTuple, в том что NamedTuple неизменяемый тип, т.е. в этой структуре нельзя модифицировать данные, а в dataclass можно

    • @pchuprinina
      @pchuprinina 3 года назад +2

      Если записать туда листы, то можно

    • @maxburner8338
      @maxburner8338 Год назад +1

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

  • @ginkt465
    @ginkt465 5 лет назад

    Годный контент! Рад что твой канал растёт!

    • @t0digital
      @t0digital  5 лет назад

      Я тоже рад:) Спасибооо!

  • @jeancalvin9430
    @jeancalvin9430 Год назад +1

    149 тыс.. я только что подписался))

  • @Алдияр-г6ж
    @Алдияр-г6ж 5 лет назад

    Классный мужик ! Суперски объясняет! Я не думал что у него может быть меньше полумиллиона.

  • @AlexandrStepanov-y4g
    @AlexandrStepanov-y4g 5 лет назад +2

    С прошедшим! Может окно с кодом делать отдельно(без прозрачности), так-то картинка конечно красивая, но все таки хотелось видеть код более выражено! В остальном Вы молодцы!

    • @t0digital
      @t0digital  5 лет назад +2

      Спасибо! Согласен, тут не очень вышло с кодом, будем стараться делать его более читаемым впоследствии

  • @vur21
    @vur21 4 года назад

    спасибо, это мне точно пригодиться

  • @mikeshmelev7359
    @mikeshmelev7359 4 года назад

    Для новичка информация полезная.

  • @hinomuratomisaburo4901
    @hinomuratomisaburo4901 3 года назад

    Круто же 💪 😎😃😃

  • @ВячеславК-м1ф
    @ВячеславК-м1ф 5 лет назад

    Спасибо тебе, друг!

    • @t0digital
      @t0digital  5 лет назад

      Рад, что полезно!

  • @koteich_live
    @koteich_live 2 года назад

    Обожаю табличку nginx на его крыжке... крайне круто смотрится...

  • @roman-romadin
    @roman-romadin 5 лет назад

    Крутое видео! Спасибо! Пошарил в twitter.

    • @t0digital
      @t0digital  5 лет назад +1

      Спасибо - отдельное за шаринг!

  • @pythondeveloper252
    @pythondeveloper252 3 года назад

    Какие плагины для подсветки синтаксиса и автодополнения вы используете в vim?

  • @darthl1ne
    @darthl1ne 5 лет назад

    С прошедшим Днём Рождения Вас ! Всего Вам самого доброго и хорошего, а главное Здоровья! Есть вопрос: будет ли видео, о установке nginx+php с нуля на сервер, и, если будет возможность, разбор конфига nginx

    • @t0digital
      @t0digital  5 лет назад

      Привет, спасибо! Есть такое видео про питон, про php тоже сделаем

    • @darthl1ne
      @darthl1ne 5 лет назад

      @@t0digital и еще вопрос. Где покупали наклейки на ноутбук?

    • @t0digital
      @t0digital  5 лет назад

      @@darthl1ne Salesbeat зелёная наклейка наша, nginx ребята из nginx подогнали, нижняя тёмная Fujifilm, с камерой в комплекте была. Фудж люблю, nginx уважаю, Salesbeat вообще Весчь:)

  • @СергейМирный-щ5е
    @СергейМирный-щ5е 5 лет назад +2

    Привет))) мог бы рассказать в одном из видео про коллекции в python ? Было бы очень интерестно

    • @t0digital
      @t0digital  5 лет назад +3

      Привет, это прям совсем азы-азы, посмотрите вот этот цикл статей, он неплох m.habr.com/ru/post/319164/
      И книги Простой Python и Byte of Python, если шире

  • @tabekg
    @tabekg 3 года назад

    Что насчёт импортов? Они тоже занимают памяти?

  • @tyomas134
    @tyomas134 4 года назад +1

    Почему не использьзовать Cython? Например, для строгой типизации переменных.

  • @ВладиславГришин-ш7ш

    В пайтоне есть поддержка СИ типов и структур прям из пайтона? т.е. как в luaJIT с FFI ?

  • @artemuk2097
    @artemuk2097 4 года назад

    Спасибо)

  • @neznajkinguitar
    @neznajkinguitar 5 лет назад +1

    хорошее качество съемки

    • @t0digital
      @t0digital  5 лет назад

      Спасибо! Стараемся:)

  • @roman-romadin
    @roman-romadin 5 лет назад +1

    Подскажите, пожалуйста - как Вы сделали презентацию кода на прозрачно фоне (эффектно плучилось)?

    • @t0digital
      @t0digital  5 лет назад +1

      Это режим наложения слоя с терминалом в Final Cut, аналогичный есть и в премьере. Здесь конкретно режим Add, черный фон терминала на черном фоне окна сзади как раз дает прозрачность в этом режиме, хотя в нижней части, где стол, получается не очень хорошо, где фон светлый

  • @evgeniygazetdinov1620
    @evgeniygazetdinov1620 4 года назад

    сейчас курю материал по вопросу ,сможешь ответить на них:
    1)потом же в любом случае придеться перегонять namedtuple в дикт или ордеред дикт и по сути время на конвертацию все убьет
    2)да и скорость операций уступает (stackoverflow.com/questions/40694470/is-there-anything-faster-than-dict)
    3) скажи в данном контексте подразумевается что весь проект будет состоять из namedtuple и вся логика будет строиться вокруг них,или это просто решение для экономии оперативной памяти в узком месте.

    • @t0digital
      @t0digital  4 года назад

      > потом же в любом случае придется перегонять namedtuple в дикт
      Не всегда надо перегонять, зачем всегда перегонять? Да и я в 1 очередь говорю про эффективное использование RAM, а не скорость работы
      > да и скорость операций уступает
      Не изучал этот вопрос глубоко, надо тестить, значительной разницы там не должно быть в скорости между использованием namedtuple и другими схожими структурами
      > весь проект будет состоять из namedtuple и вся логика будет строиться вокруг них, или это просто решение для экономии оперативной памяти в узком месте
      Экономия в узком месте там, конечно. Иначе бы вовсе дикты были бы не нужны. Хотя именованные кортежи или dataclass или TypedDict я еще использую как часть документирования типа аргументов, что очень удобно.

  • @ИванИванов-н9т9ъ
    @ИванИванов-н9т9ъ 4 года назад

    Такое впечатление, что при объявлении Record (5:07) пропущены запятые (всего два поля). Тогда замеры памяти могут быть не точными.

    • @t0digital
      @t0digital  4 года назад +1

      Эта запись:
      Record = namedtuple('Record', 'first second third')
      создаёт именованный tuple с тремя полями - first, second, third

    • @ИванИванов-н9т9ъ
      @ИванИванов-н9т9ъ 4 года назад

      @@t0digital Понял, извините.

    • @t0digital
      @t0digital  4 года назад +1

      @@ИванИванов-н9т9ъ все ок!

  • @MaPeHuH
    @MaPeHuH 5 лет назад +1

    Добрый день! А не могли бы Вы снять ролик на тему как Вы настроили Vim из CLI для работы с python и Django. Я попытался это сделать, но опыта в linux у меня мало и не получилось. Не мог даже найти директорию .vim в домашнем каталоге ~/ хотя ls -a выполнял :-)

    • @t0digital
      @t0digital  5 лет назад

      Её там может и не быть (директории .vim в домашней директории) - но её можно создать, так же как может и не быть .vimrc в домашней, тоже можно создать и Vim его найдёт при следующем запуске. Про вим будут ещё видео обязательно!

  • @BorisBrodski
    @BorisBrodski 5 лет назад

    Есть ли plugin для vim, который бы понимал структуры и подсказывал поля и типы? Спасибо и с прошедшим!

  • @mihahahahahahahah
    @mihahahahahahahah 5 лет назад

    тема огонь

  • @vasiliynet3425
    @vasiliynet3425 5 лет назад

    Лайк. Интересная тема. И вопрос по ней есть: в случае иерархических структур, допустим, многоуровневый справочник, типа: города - магазины - сервисы, встречал практику связывать сущности и по свойству "дети" (js), и "родители" (1с). А как в python сложилась практика выражения иерархий?

    • @t0digital
      @t0digital  5 лет назад

      Не очень понял вопрос, но по сути можно реализовать это так:
      data = [{
      'city_name': 'Москва',
      'population': 15_000_000,
      'shops': [{
      'domain': 'shop1.ru',
      'cms': 'Bitrix',
      'services': [{
      'id': 1,
      'service_name': 'service 1'
      },{
      'id': 2,
      'service_name': 'service 2'
      }]
      }]
      }]

  • @antonmullakhmetov707
    @antonmullakhmetov707 5 лет назад

    Спасибо

  • @Denis-ou2tx
    @Denis-ou2tx 2 года назад

    Если реализовать датакласс, 1 из атрибутов которого будет являться сложный объект, а не примитив, то как реализовать сравнение экземпляров данного класса? Ожидаю, что есть 2 экземпляра, значения атрибутов которых равны, и при сравнение экземпляров ожидаю True

  • @user-13520sdf
    @user-13520sdf 4 года назад

    А если вместо named tuple использовать обычные классы? То же самое будет? Ну то есть класс с конструктором, методами, свойствами.

    • @t0digital
      @t0digital  4 года назад

      Не то же самое, NamedTuple это ведь именованный кортеж, у него свое специфичное поведение есть, присущее tuple, которого в обычном классе не будет (если его не реализовывать отдельно, конечно)

    • @user-13520sdf
      @user-13520sdf 4 года назад

      Диджитализируй! Да, я имею в виду если использовать свои классы с некоторым простым поведением, то по памяти то же самое будет? И ещё, к примеру, slots указать, то это, по идее, и быстрее будет и памяти меньше занимать чем named tuple

    • @t0digital
      @t0digital  4 года назад

      сравните:)

  • @ОлегПотєхін
    @ОлегПотєхін 5 лет назад

    Было б отлично увидеть контент для применения знаний после курсов или теории ниша еще не заполнена

    • @t0digital
      @t0digital  5 лет назад

      Для применения знаний после курсов это как? Просто пишите, пишите что угодно, на работе и дома:)

  • @АлександрБурдин-щ3в

    tuple по моему произносится как "тьюпл". Спасибо за видео, тоже борюсь за оптимизацию работы питоновских программ

    • @t0digital
      @t0digital  5 лет назад

      Да, вы правы, надо стремиться к правильному произношению. Спасибо!

    • @DmitryB876
      @DmitryB876 5 лет назад

      Как раз по разному произносят это слово носители английского языка. Кто-то тьюпл, кто-то тапл - нет единого мнения. Ребята из Postgres Professional называют их тапл, а в PostgreSQL одни сплошные таплы кругом :) Вот ещё пример: ru.forvo.com/word/tuple/

    • @DmitryB876
      @DmitryB876 5 лет назад

      Еще из неоднозначных Issue: ru.forvo.com/word/issue/ Но здесь четко видно разделение по англичанам и американцам.

  • @gapchannelAi
    @gapchannelAi 3 года назад

    Я с 2021 ❤️❤️❤️❤️

  • @ЕвгенийШаров-ч4ш
    @ЕвгенийШаров-ч4ш 5 лет назад

    Привет, какую литературу выбрать для быстрейшего освоения Python?

    • @t0digital
      @t0digital  5 лет назад +2

      Привет, лови:
      * Если уже работал с другим языком программирования, хороший выбор «Byte of Python» python.swaroopch.com/, есть PDF версии и перевод на русский, но не уверен, что сильно актуальные
      * Если опыта с другими языками нет или для углубления после «Byte of Python» - книга «Простой Python» www.ozon.ru/context/detail/id/136792714/?partner=goloburdin&
      * Ещё глубже - «Python. К вершинам мастерства» www.ozon.ru/context/detail/id/139599468/?partner=goloburdin&
      * И отличный справочник, из которого можно много выцепить - «Стандартная библиотека Python 3. Справочник с примерами» www.ozon.ru/context/detail/id/146183163/?partner=goloburdin&

  • @ВладиславГришин-ш7ш

    Вы пайтону 10 ки гигабайт в сложные структуры данных засовываете? и как производительность приложения при этом?

    • @t0digital
      @t0digital  5 лет назад

      Приложения и задачи бывают разные, и иногда это здравая идея обрабатывать данные именно так. Это не реалтайм задача в вебе, нормально все себя чувствует

  • @лилпипка
    @лилпипка 5 лет назад +3

    Ещё ждём видос по виму

    • @t0digital
      @t0digital  5 лет назад

      Что конкретно вам хочется узнать по виму?

    • @лилпипка
      @лилпипка 5 лет назад +1

      @@t0digital про интересные плагины, фишки vimrc, самого вима, всё такое. Видел что можно для разных языков отдельный конфиг делать, вот это было бы круто

    • @t0digital
      @t0digital  5 лет назад +1

      Хорошо

  • @petersafronow5149
    @petersafronow5149 4 года назад

    Что за IDE?

  • @legendabs1110
    @legendabs1110 5 лет назад

    А если я у vim(e) написал програму,как его сохранить в апк файл

    • @t0digital
      @t0digital  5 лет назад

      Скомпилировать. Вим это редактор текста, не компилятор.

    • @legendabs1110
      @legendabs1110 5 лет назад

      @@t0digital а если я скомплилирую в онлайн компиляторе я смогу запустить на телефоне?

    • @t0digital
      @t0digital  5 лет назад

      @@legendabs1110 ну в целом можно. Я не пробовал)

    • @legendabs1110
      @legendabs1110 5 лет назад

      @@t0digital ну если вам не трудно снимите виедо я буду очень рад😊

    • @t0digital
      @t0digital  5 лет назад

      По мобильной разработке навряд ли на этом канале в ближайшее время будет материал. Не самая сильная наша компетенция на сегодня

  • @736939
    @736939 5 лет назад +2

    Вообще если работать с большими данными, то нет ничего лучше, чем датафреймы pandas

    • @t0digital
      @t0digital  5 лет назад

      Да, это уже под задачу:)

  • @nobeing6242
    @nobeing6242 5 лет назад

    Видео получилось о том, что в библиотеке тайпинг..есть нотации типов, которые помогают не ошибиться так как и идэешка с встроенными чекерами просигнализирует об этом, типо чувак ты должен был вместо строк туда класть числа. Так что тема не раскрыта. Кортежи и именованные кортежи весят одинаково. Кортежи можно рассматривать как записи с полями, тип поля которых определяется содержимым. Чтоб потреблять меньше памяти надо использовать сериализацию, либо создать свой метакласс типа struct. Так что тема видоса опять не расскрыта.

    • @t0digital
      @t0digital  5 лет назад

      Нет, вы не правы, чтобы потреблять меньше памяти, надо переписать всё просто на asm. Предложение в видео использовать вместо list/dict кортежи, удобнее которых именнованные кортежи, удобнее которых именнованные типизированные кортежи - это всё фигня, struct тоже фигня. ASM, вот как надо писать Python.

  • @nickolayfetlistov4416
    @nickolayfetlistov4416 4 года назад

    а как же pandas , numpy???

    • @t0digital
      @t0digital  4 года назад

      а как же научный калькулятор???

    • @nickolayfetlistov4416
      @nickolayfetlistov4416 4 года назад

      @@t0digital не понял вашего сарказма

  • @DmitryB876
    @DmitryB876 5 лет назад

    Возвращаясь к вопросу как правильно произносить слово tuple (тапл, тупл, тьюпл) - советы профессионалов :)
    Книга "(O'Reilly-Питер) Простой Python - Современный стиль программирования (Билл Любанович) [2016]", стр.70:
    Вы могли слышать два возможных варианта произношения слова tuple (кортеж). Какой же из них является правильным? Если вы ответите неправильно, станут ли вас называть позером? Не волнуйтесь. Гвидо ван Россум, создатель языка Python, написал (bit.ly/tupletweet): «Я произношу слово tuple как too-pull по понедельникам, средам и пятницам и как tub-pull - по вторникам, четвергам и субботам. В воскресенье я вообще о них не говорю :)».

    • @t0digital
      @t0digital  5 лет назад +2

      Книжка Любановича одна из лучших на мой взгляд для первоначального знакомства с Python:) И Byte of Python

  • @SemyonPogoreltsev
    @SemyonPogoreltsev 5 лет назад

    Можно же по сути адски упороться и использовать ctypes )0))0)

  • @TheUnitto
    @TheUnitto 5 лет назад

    А ничего что словать это хешмапа со всеми вытекающими, а датаклас это обьект с вализациями? В то время как именованый кортеж это просто хранилище? Не резировое как хешмапа и без валидации как датаклас?

  • @doomymax577
    @doomymax577 5 лет назад

    А где привет котаны?

  • @ПуляевГригорий
    @ПуляевГригорий 5 лет назад

    Листинги показывай на однородном не прозрачном фоне! Именованный кортеж занимает столько же места как и обычный, но нужно 10 раз подумать перед тем как его использовать. Например его нельзя нормально сериализовать, его могут не понимать нужные библиотеки и драйверы БД. В общем пользуйтесь кортежами и всё будет хорошо.

    • @t0digital
      @t0digital  5 лет назад

      Именованные кортежи сериализуются идентично обычным gist.github.com/alexey-goloburdin/18c82fd011379a83a70aae739d0296d9

    • @ПуляевГригорий
      @ПуляевГригорий 5 лет назад

      @@t0digital ЧЯДНТ? bpython version 0.18 on top of Python 3.7.3 /usr/bin/python3
      >>> import pickle
      >>> from collections import namedtuple
      >>> s = namedtuple("tmp", ["tmp1", "tmp2", "tmp3"])
      >>> s1 = s(1,2,3)
      >>> pickle.dumps(s1)
      Traceback (most recent call last):
      File "", line 1, in
      pickle.dumps(s1)
      _pickle.PicklingError: Can't pickle : attribute lookup tmp on __main__ failed

    • @t0digital
      @t0digital  5 лет назад

      ​@@ПуляевГригорий называйте переменную и первый параметр в namedtuple одним названием:
      >>> import pickle
      >>> from collections import namedtuple
      >>> s = namedtuple("s", ["tmp1", "tmp2", "tmp3"])
      >>> s1 = s(1,2,3)
      >>> pickle.dumps(s1)

    • @ПуляевГригорий
      @ПуляевГригорий 5 лет назад

      @@t0digital так может и сериализуется, а вот так точно сломается:
      >>> import pickle
      >>> from collections import namedtuple
      >>> keys = [["tmp"], ["tmp1", "tmp2"]]
      >>> values = [[1], [2,3]]
      >>> s = []
      >>> for k,v in zip(keys, values):
      ... cls = namedtuple("cls", k)
      ... s.append(cls(*v))
      ...
      >>> pickle.dumps(s)
      Traceback (most recent call last):
      File "", line 1, in
      pickle.dumps(s)
      _pickle.PicklingError: Can't pickle : it's not the same object as __main__.s

    • @t0digital
      @t0digital  5 лет назад

      Написали неработающий код, ну бывает:) Вот работающий - gist.github.com/alexey-goloburdin/18c82fd011379a83a70aae739d0296d9
      Красиво ли использовать globals? Нет. Реальна ли задача, при которой надо генерить новые типы данных в цикле? Нет, но даже если и да - это плохая практика. Добавляет ли namedtuple своих особенностей в код, которых нет в tuple? Конечно. Значит ли это, что не надо использовать namedtuple вместо tuple? Нет, в общем случае namedtuple гораздо более красивый и удобный способ представления данных, чем tuple, потому что более читаемый и очевидный.
      sometuple.first_name - лучше, чем sometuple[0].

  • @maxburner8338
    @maxburner8338 Год назад

    148тыс))