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

Поділитися
Вставка
  • Опубліковано 29 лис 2024

КОМЕНТАРІ • 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 со скоростью чего?

  • @egorkomarov4719
    @egorkomarov4719 5 років тому +10

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

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

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

  • @mykytao5028
    @mykytao5028 4 роки тому +26

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

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

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

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

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

  • @andreil174
    @andreil174 3 роки тому +3

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

  • @PikaCh-t7i
    @PikaCh-t7i 2 роки тому

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

  • @MaPeHuH
    @MaPeHuH 5 років тому +5

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

    • @t0digital
      @t0digital  5 років тому

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

  • @andrewslee_channel
    @andrewslee_channel 4 роки тому +2

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

  • @ВикторКозлов-г6б
    @ВикторКозлов-г6б 2 роки тому

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

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

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

  • @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.

  • @mikeshmelev7359
    @mikeshmelev7359 4 роки тому

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

  • @ohmygoodness4653
    @ohmygoodness4653 5 років тому +2

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

    • @t0digital
      @t0digital  5 років тому

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

  • @ginkt465
    @ginkt465 4 роки тому

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

    • @t0digital
      @t0digital  4 роки тому

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

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

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

  • @Алдияр-г6ж
    @Алдияр-г6ж 5 років тому

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

  • @mentatij
    @mentatij 5 років тому +1

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

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

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

  • @ВячеславК-м1ф
    @ВячеславК-м1ф 4 роки тому

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

    • @t0digital
      @t0digital  4 роки тому

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

  • @AlexandrStepanov-y4g
    @AlexandrStepanov-y4g 5 років тому +2

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

    • @t0digital
      @t0digital  5 років тому +2

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

  • @artemuk2097
    @artemuk2097 4 роки тому

    Спасибо)

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

    Круто же 💪 😎😃😃

  • @roman-romadin
    @roman-romadin 5 років тому

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

    • @t0digital
      @t0digital  5 років тому +1

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

  • @СергейМирный-щ5е
    @СергейМирный-щ5е 5 років тому +2

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

    • @t0digital
      @t0digital  5 років тому +3

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

  • @antonmullakhmetov707
    @antonmullakhmetov707 5 років тому

    Спасибо

  • @mihahahahahahahah
    @mihahahahahahahah 5 років тому

    тема огонь

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

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

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

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

  • @darthl1ne
    @darthl1ne 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

    • @darthl1ne
      @darthl1ne 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

  • @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 я еще использую как часть документирования типа аргументов, что очень удобно.

  • @neznajkinguitar
    @neznajkinguitar 5 років тому +1

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

    • @t0digital
      @t0digital  5 років тому

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

  • @roman-romadin
    @roman-romadin 5 років тому +1

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

    • @t0digital
      @t0digital  5 років тому +1

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

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

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

  • @MaPeHuH
    @MaPeHuH 5 років тому +1

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

    • @t0digital
      @t0digital  5 років тому

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

  • @BorisBrodski
    @BorisBrodski 4 роки тому

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

  • @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'
      }]
      }]
      }]

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

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

  • @ОлегПотєхін
    @ОлегПотєхін 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

  • @АлександрБурдин-щ3в
    @АлександрБурдин-щ3в 5 років тому +1

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

    • @t0digital
      @t0digital  5 років тому

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

    • @DmitryB876
      @DmitryB876 5 років тому

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

    • @DmitryB876
      @DmitryB876 5 років тому

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

  • @ИванИванов-н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ъ все ок!

  • @лилпипка
    @лилпипка 5 років тому +3

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

    • @t0digital
      @t0digital  5 років тому

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

    • @лилпипка
      @лилпипка 5 років тому +1

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

    • @t0digital
      @t0digital  5 років тому +1

      Хорошо

  • @user-13520sdf
    @user-13520sdf 4 роки тому

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

    • @t0digital
      @t0digital  4 роки тому

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

    • @user-13520sdf
      @user-13520sdf 4 роки тому

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

    • @t0digital
      @t0digital  4 роки тому

      сравните:)

  • @736939
    @736939 5 років тому +2

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

    • @t0digital
      @t0digital  5 років тому

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

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

    Я с 2021 ❤️❤️❤️❤️

  • @nobeing6242
    @nobeing6242 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

  • @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

  • @ЕвгенийШаров-ч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&

  • @Denis-ou2tx
    @Denis-ou2tx 2 роки тому

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

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

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

    • @t0digital
      @t0digital  5 років тому

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

  • @SemyonPogoreltsev
    @SemyonPogoreltsev 5 років тому

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

  • @legendabs1110
    @legendabs1110 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

    • @legendabs1110
      @legendabs1110 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

    • @legendabs1110
      @legendabs1110 5 років тому

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

    • @t0digital
      @t0digital  5 років тому

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

  • @petersafronow5149
    @petersafronow5149 4 роки тому

    Что за IDE?

  • @nickolayfetlistov4416
    @nickolayfetlistov4416 4 роки тому

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

    • @t0digital
      @t0digital  4 роки тому

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

    • @nickolayfetlistov4416
      @nickolayfetlistov4416 4 роки тому

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

  • @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тыс))

  • @TheUnitto
    @TheUnitto 5 років тому

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