4 совета как ЛУЧШЕ писать циклы For на Python

Поділитися
Вставка
  • Опубліковано 4 лют 2025

КОМЕНТАРІ • 359

  • @splinter928
    @splinter928 2 роки тому +111

    Затраты памяти ещё сравните у функций с генератором и с листом в 4 примере

    • @zproger
      @zproger  2 роки тому +18

      хорошая идея, в следующих видео добавлю и затраты ресурсов для наглядности

    • @splinter928
      @splinter928 2 роки тому +42

      @@zproger и сразу станет видно, что не в скорости прелесть генератора :-)

    • @dmitriyneledva4693
      @dmitriyneledva4693 2 роки тому +2

      @@splinter928 в этом конкретном случае не станет

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

      @@dmitriyneledva4693 Из-за того что немного памяти занимает эти данные?

    • @victorpetchenev4119
      @victorpetchenev4119 2 роки тому +11

      Пишите на ассемблере

  • @berlin3589
    @berlin3589 2 роки тому +92

    В книге «питон.Чистый код» посвящена была эта тема, а функции zip() в первые увидел в книге «Однострочники Питон»
    Очень маленькие детали!Очень рад, что автор показывает их
    Было бы еще интереснее, если ты показал как итераторы работают, создав свой класс(протокол итераторов)

  • @MrPalianytsia
    @MrPalianytsia Рік тому +6

    первая задача res = n * (n + 1) // 2 я понимаю что не тема ролика, но молодому программисту обязательно нужно повторять что программист это в первую очередь умный человек который оптимизирует свои алгоритмы поиска решения.

  • @Python-i2z
    @Python-i2z 5 місяців тому +3

    Здравствуйте, очень полезное видео, спасибо вам за добро которые вы делаете когда делитесь с знаниями

    • @zproger
      @zproger  5 місяців тому +2

      Благодарю за комментарий! Рад что видео принесло вам пользу!

  • @_M.i.h.a.i.l._
    @_M.i.h.a.i.l._ 2 роки тому +66

    На мой взгляд - если чел использует цикл 'For' вместо 'Sum' то это просто незнание встроенных команд / функций и т.д.

    • @13-th_Lord
      @13-th_Lord 11 місяців тому +3

      А ведь до этого можно и случайно додуматься, к примеру когда в голову придёт мысль "Хм, ну даже в Microsoft Exel есть SUM. И в паскале на уроках информатики в школе что-то такое вроде тоже было, хоть и в сраку паскаль ибо слишком сложно. А вдруг и здесь тоже получится?"))
      (Это моя реальная история из жизни, пхахах))

    • @ultracolor
      @ultracolor 10 місяців тому +1

      Я знаю о функциях prod и sum, но практически никогда их не использую, так как в большинстве случаев оказывается что в формуле будет не просто сумма и все равно придется писать цикл.

    • @s4ndstrm378
      @s4ndstrm378 10 місяців тому

      Да нет ,это дает разнообразие решения задач

    • @xxxbunx
      @xxxbunx 10 місяців тому

      ​​@@13-th_Lord паскаль слишком сложно? нууууу... вроде самый простой и логичный язык. синтаксис у него конечно так себе...

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

    Лучший! Спасибо за качественный контент

    • @zproger
      @zproger  2 роки тому +1

      Спасибо

  • @tamirlanmakhov5027
    @tamirlanmakhov5027 2 роки тому +6

    на первой минуте звучит фраза, что sum - принимает итератор, что абсолютно не верно. sum - принимает iterable, т.е итерируемый объект.

    • @zproger
      @zproger  2 роки тому +2

      Спасибо за исправление, оговорился

  • @WertiGo260990
    @WertiGo260990 2 роки тому +43

    Не используйте таймер как замер скорости, во 1х это показывает что разницу во времени только на вашей конфигурации, во 2х даже если вы запустите 2 раза или более значения будут отличаться, так как слишком много от чего будет зависеть время выполнения(например в данный момент при замере первого алгоритма у вас был простой а при замере второго алгоритма ос полезла проверять обновления или ещё че и все уже не достоверное отличие). Лучше поищите информацию как замерить сложность алгоритма в Пайтон.

    • @АнтонЕсипенко-м2н
      @АнтонЕсипенко-м2н 2 роки тому +17

      Ну или надо делать пару тысяч замеров по одной и той же задаче и выводить среднее. Тогда будет более-менее близко к правде

    • @Dvoechnik2
      @Dvoechnik2 2 роки тому +11

      Надо использовать модуль timeit, он запускает фрагмент кода n раз (1000000 по умолчанию)

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

      Суть не в том, за какое время выполнится код, суть в том, чтобы увидеть разницу между 2 подходами. Он написал и запустил оба варианта одновременно, а это значит, что замер покажет разницу правильно. Ну, конечно, если вдруг компьютер не запустит все обновления и не начнёт искать вирусы ровно в тот момент, когда ты запускаешь код, получается ровно через 0.7 секунды))

    • @КириллЧе-я5ы
      @КириллЧе-я5ы Рік тому +1

      @@beardedman721замер правильно разницу не покажет, но статически значимые отличия гипотез получим именно в этих случаях…

    • @blacter7152
      @blacter7152 Місяць тому

      Спасибо. Я вот уже раз 10 запустил первый пример, и у меня 0.1 время первого цикла, 0.09 - второго.

  • @шелбичные-нарезки
    @шелбичные-нарезки 2 роки тому +2

    превью это жиза просто. с каждым днём всё лучше, удачи тебе!)

  • @АндрейСойко-р6п
    @АндрейСойко-р6п 2 роки тому +1

    Отличная подача, подписался на канал!

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

      Благодарю

  • @metasy_
    @metasy_ Рік тому +4

    А почему бы не использовать filter + map + sum вместо list comprehension + sum и generator + sum?

  • @УголокКодера
    @УголокКодера 2 роки тому +3

    Время затрачиваемое на работу зависит от кучи переменных, тестить нужно не 1 раз, а запускать код раз 100 и считать среднюю, а если требуется сложная логика, то генераторами с ума сойдёшь её программировать.

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

    В первом примере можно сократить до print(sum(range(1_000_000)))

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

      Есть такое, об этом писал в телеграмм канале после публикации видео

  • @Vednier
    @Vednier 5 місяців тому

    То есть, вкратце, пользуйтесь sum для суммирования списка, индексы берите из enumеrate(верно только на чтение), листы склеивайте параллельно zip-ом и по возможности фильтруйте данные в временный список перед работой с ними.
    Так-то все логично, но в учебниках не особо говорят о том что for по индексам медленный.

  • @backdownof
    @backdownof Рік тому +2

    обычно когда доходит до оптимизации кода, проблема не в том, что цикл работает в 1.5-2 раза медленнее, а в том какими структурами данных ты пользуешься. Но с точки зрения написания кода, да примеры из видео как минимум читать приятнее, потому что Pythonic way

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov 2 роки тому +3

    Благодарю! 🔥👍

    • @zproger
      @zproger  2 роки тому +1

      Рад что понравилось =))

  • @rusnickk
    @rusnickk 2 роки тому +2

    На 4:25 сначала один байт код enumirate, а в следующем кадре уже сравнивается с другим байткодом. При этом если сравнить первоначально показанный байткод, то для enumirate это 5 инструкций, а для for это всего 3, если считать от FOR_ITER до JUMP_BACKWARD. Интересно было бы сравнить enumirate с простым циклом for num in numbers с инкремент внутри переменной счётчика i объявленной вне цикла.

  • @non5309
    @non5309 2 роки тому +15

    генераторы будут лучше по времени если ожидается получения негативного условия в выражении формирования. Здесь же в примере все значения участвуют, пример в пользу списочного выражения. Но разница все равно копеечная, экономия в памяти все равно выводит выражения генераторы на первое место.

  • @ismailisabekov8424
    @ismailisabekov8424 2 роки тому +2

    Спасибо за видео, хоть и знал про эти методы, но лишним не будет. Про zip вообще уже забыл, когда изучал python пару раз использовал, с тех пор вообще о нем забыл. И кстати в следующий раз декоратор для замера времени используй, чтобы меньше кода было, просто не все сразу поймут просматривая это. А так все чётко.

    • @ismailisabekov8424
      @ismailisabekov8424 2 роки тому +1

      Какой хороший питон, Я щас с# изучаю, и в начале не мог привыкнуть к этим ;, {}, строгой типизации, void, множество типов данных. Но про питон тоже не забываю.

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

      @@ismailisabekov8424 А почему void прям отдельно? 🤔

    • @ismailisabekov8424
      @ismailisabekov8424 2 роки тому +1

      @@nakidai потому что не привык задавать типы, к тому же каждый раз писать void, если метод ничего не возвращает. Я привык в питоне к примеру написал функцию которая просто выполняет какую-то задачу, но ничего не возвращает. Думаю, это из-за привычек, и void по началу Я забывал писать чаще, чем те же ;

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

      @@ismailisabekov8424 Изучал С++ школьником, почти 20 лет назад уже. Сейчас всё делаю на питоне. Блин, как же это красиво: строгая типизация у всего в том числе у функий, приватные и публичные члены классов. Мой внутренний перфекционист часто негодует, что этого нет в питоне. Особенно бесит, что содержимое классов можно менять извне.

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

    Дружище. Насчёт второго примера.
    1) Повторил код твоих функций из примера пуля в пулю. У меня 100% быстрее работает с индексами и для меня это не откровение - enumerate очень долгая штука (по крайней мере до 3.10 питона включительно) - я это не однократно проверял, могу куда угодно пруфы скинуть.
    2) говорить что байткода выполняется меньше, значит и код выполняется быстрее - неверно. Меньше кода это не всегда быстрее. Как раз-таки оптимизация чаще всего и приводит к увеличению кода - типа в рекурсивную функцию для вычисления чисел фиббоначи добавить кеширование вычисленных чисел - кода становится больше, а скорость вычисления улетает в космос. Больше действий не значит быстрее. Зависит от скорости каждого действия в обоих множествах действий. Ещё раз говорю - куда угодно могу скинуть пруфы что с индексами быстрее работает.
    И да, байткода мы там так и не увидели. Представленное является дизассемблированным кодом питона, это не байт-код, это набор ассемблерных инструкций

  • @coldssielens161
    @coldssielens161 2 роки тому +1

    Подскажи, что у тебя за дистрибутив и какое графическое окружение стоит ?

    • @zproger
      @zproger  2 роки тому +1

      Zorin OS + дефолт окружение

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

    1-ый пример совершенно притянутый за уши, я такого в реальной жизни никогда не видел. Давайте возьмем какую-нибудь вложенную структуру, в ней что-то найдём (причём найдём как-то не так чтобы очень просто, с переходом в другие процедуры) и оттуда уже суммируем данные по циклу. Впрочем, 4-й пример именно об этом.
    2-ой, да согласен, это так и есть.
    3-й, согласен, zip -- сила. )))
    4-й, тоже согласен.
    Разница как бы не такая большая, если процедура выполняется один раз, но если оно балалайкой повторяется миллион раз в цикле... )))

  • @mak32
    @mak32 2 роки тому +9

    Спасибо большое за видео🙂 Давай побольше такого рода сравнений, а то тема, что python медленный очень сильно засела в башке у людей моего окружения. Вот хотя бы такими видео буду потихоньку развивать у них сомнения

    • @mak32
      @mak32 2 роки тому +1

      .да и еще, как с использованием enumirate найти в списке максимальное кол-во повторяющихся элементов?

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

      @@mak32 Лучше используйте collections.Counter для этого

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

      Спасибо

    • @mikeofs1304
      @mikeofs1304 2 роки тому +1

      Если они пишут на плюсах или расте , мало что у тебя получится, хотя есть синтетические примеры где питон обгонят плюса. Правда там обычно используются написанные отцами на тех плюсах библиотеки питона против банального авторскогобыдлокода на плюсах. Прелесть питона не в скорости, и там где она реально нужна на нем писать никогда не будут, будут на расте. Питон нужен для скорости/дешевизны разработки и поддержки

    • @MT-mv1qw
      @MT-mv1qw 2 роки тому +1

      @@mikeofs1304 проблема в том, что большинство людей используют питон пяткой правой ноги.
      Пример из жизни. Либа для аналитики. Питон. Работа с таблицами. Вместо сортировки pandas, которая оптимизирована для этих целей -- пузырек. Нашел случайно, когда на 10+млн строках ноут уже помирал... Как по мне -- такое надо показывать. Т.к. те, кто не знаком с питоном будут решать задачу стандартными алгоритмами, когда есть готовые либы "написанные отцами на тех плюсах" или те же sum(list). Пустяк, но целому отделу аналитики, работающему на тб данных работу ускорит

  • @vz2503
    @vz2503 2 роки тому +1

    Спасибо. Ценный контент.

  • @notMails
    @notMails 2 роки тому +2

    "Сейчас я вам покажу, как не надо использовать циклы for".
    В первых двух примерах создает списки через list comprehension, вместо обычного list(range(1000000)), на который тратится еще меньше времени.
    Более того, если продолжить, то первый пример и вовсе абсурден, ведь функции sum() не нужен список, ей нужен итерируемый объект.
    Так что все заканчивается как: sum(range(1000000)). И тратится на это в 3 раза меньше времени, чем на финальный вариант автора.

  • @aweryc
    @aweryc 2 роки тому +1

    Крсава! Все четко! Хорошо я так и писал)

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

      Благодарю

  • @Alcoholdehydrogenas
    @Alcoholdehydrogenas 11 місяців тому

    А что быстрее работает: списки или кортежи? По кортежам тоже можно сумму находить.

  • @__init__.
    @__init__. 2 роки тому +1

    У меня есть 2 функции для деления текста на страницы.
    обрезание страницы было реализовано через цикл фор как раз по индексам.
    Заменил рейндж лен на енумерейт время выполнения функции возросло в 2 раза

  • @lolzplaysofficial6883
    @lolzplaysofficial6883 3 місяці тому

    Мне стало непонятно, почему в первом примере вместо numbers = [num for num in range(1_000_000)] не использовать просто
    numbers = range(1_000_000) и потом точно так же вывести sum(numbers)? Интересно было бы узнать причину.

  • @Георгий-ц6с3п
    @Георгий-ц6с3п 2 роки тому +1

    Спасибо большое за информацию я только только начинаю спасибо

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

      Пожалуйста, желаю успешного изучения!

  • @Mr_AnKei
    @Mr_AnKei 2 роки тому +1

    Вот 2 пример - это про меня 😎

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

      😎 😎

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

      Шок контент - этот 🍀клевер приносит удачу, по слухам, если его скопировать и вставить в код, он сделает код оптимизированным и быстрым.

  • @daniilborsh
    @daniilborsh 2 роки тому +2

    Это база!
    Больше всего обидно, что реьята, которые сейчас монут учиться не учатся, а сразу бегут в разработку

    • @arkptz1607
      @arkptz1607 2 роки тому +1

      практика самое лучше обучение :)

  • @КириллЧе-я5ы
    @КириллЧе-я5ы Рік тому

    Интересно, а паттерн мэтч с вычислимыми полями работает быстрее условных операторов?..

  • @ttarnkfufts
    @ttarnkfufts 2 роки тому +1

    Доброго времени суток. Какую программу используюте для написания кода?

  • @Ju8Sho
    @Ju8Sho 2 роки тому +1

    Привет, подскажите пожалуйста какой Линукс дистрибутив используете?

    • @zproger
      @zproger  2 роки тому +1

      ZorinOS

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

      Спасибо

  • @dzen1208
    @dzen1208 2 роки тому +1

    Какой у тебя шрифт в ВС коде?

    • @zproger
      @zproger  2 роки тому +1

      Стандартный, ничего не менял

  • @ДанилЗиновьев-ы5х
    @ДанилЗиновьев-ы5х 2 роки тому +22

    Еще можно сократить код немного и вместо `numbers = [num for num in range(1_000_000)]` писать `numbers = range(1_000_000)`
    Но в первом случае тип объекта list, а во втором range, если нужен list, то просто надо написать так `numbers = list(range(1_000_000))`
    Не знаю как это с точки зрения производительности, но по клавишам вы нажимаете меньше, спасибо за внимание)

    • @huseeads
      @huseeads 2 роки тому +2

      меньше памяти занимает, range не хранит все эти числа в отличие от list

    • @ГлавнаяМразьЮтуба-ц5я
      @ГлавнаяМразьЮтуба-ц5я 2 роки тому +1

      range это итератор, а с помощью генератора получим список

  • @НикитаГолубов-й9ф
    @НикитаГолубов-й9ф 2 роки тому

    Странность в Python:
    >>> class Test:
    def __hash__(self):
    return -1

    >>> t = Test()
    >>> t.__hash__()
    -1
    >>> hash(t)
    -2
    >>>

  • @dmitry-lz1ny
    @dmitry-lz1ny 2 роки тому +1

    Сам удивился в свое время сравнению скорости.
    По результатом получается так: list comprehension, генераторы уже медленнее и в конце map.

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

      Да, но как говорили в комментах ниже, стоит бы еще затраченные ресурсы проверить в дальнейшем

  • @АлександрКоновалов-ш1н

    Почему в сравнении суммы и цикла участвует ещё и создание списка? Нельзя его сначала отдельно создать, а потом передать в функцию?

    • @vas_._sfer6157
      @vas_._sfer6157 2 роки тому

      А ещё и вывод в консоль 😂. Не люблю негатив, но таких косяков очень много у автора канала.

  • @Smbrine
    @Smbrine Рік тому

    Уважаемые комментаторы, которые считают, что нынешних мощностей хватает, чтобы любая программа летала, а особенно ваши калькуляторы. Объясняю, во-первых все подобные замедления суммируются, то есть 0.4 секунды в одном месте, 0.8 в другом, ещё 0.6 в третьем и вот, казалось бы, простая программка из трёх функций, а две лишние секунды потрачены из-за невежества автора кода. Во-вторых, лично мне подобные лайфхаки помогли с нейронными сетями, когда каждая миллисекунда на счету и по сути вручную замеряешь каждый элементы тренировки с целью оптимизации, такие значительные изменения убирают в сумме дни обучения модели

  • @ririol
    @ririol 2 роки тому +1

    >байтойобить
    >байтойобить на питоне

  • @archie-blend
    @archie-blend 2 роки тому +17

    Если вам нужна производительность очень советую посмотреть в сторону numpy. Разница порой набирается на целый порядок

    • @z.dekuch1987
      @z.dekuch1987 2 роки тому +6

      А просто потому что, numpy написан на С, и некоторые свои функции преобразовывает под тот же С, когда свой код остаётся на питоне.
      P.s. Для тех, кто в танке, язык "С" работает в разы быстрее, чем питон.

    • @b213videoz
      @b213videoz 2 роки тому +7

      @@z.dekuch1987 язык "С" не работает "в разы быстрее питона" - скомпилированные программы писанные на С работают быстрее чем скрипты интерпретируемые питоном, и не в разы а на порядки быстрее 😉

    • @ultracolor
      @ultracolor 10 місяців тому

      Если нужна производительность лучше не писать на python

    • @artyommakovskiy8974
      @artyommakovskiy8974 7 місяців тому

      Numpy + Numba тогда.
      И можно оставаться на пайтоне.
      Обе библиотеки разрабатывались для научных вычислений, как я понял.
      Намба особенно впечатляет, код не усложняет и изучать не нужно.
      из "тонкостей" только использование кэша.

  • @Limon12rus13
    @Limon12rus13 2 роки тому +6

    Последний пример можно реализовать через фильтр по 0 элементу списка по далее вытащить 1 элементы и потом сделать суммирование итога. Получится сильно быстрее.
    Вообще, for, while нужно использовать только тогда, когда идёт сложная трансформация данных, для всего остального есть генераторы, встроенные методы переборки вроде map и collections

    • @cdgAxel
      @cdgAxel 2 роки тому +1

      конкретно тут это не будет быстрее, потому что глупо просеивать список из tuple, а потом суммировать вторые элементы из этих tuple.

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

    Генератор списка и генераторное выражение не отличаются по скорости, отличие в потребление памяти, генератор списка, что очевидно создает список со всеми значениями, а генераторное выражение отдает по одному значению(имеет свойства объекта итеретора).
    А еще в качестве примера можно было попробовать while циклы и рекурсии.

  • @serufim
    @serufim 2 роки тому +2

    для первого примера еще можно попробовать через reduce

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

    Лист-комп - это генератор обернутый в класс лист с помощью [ ]
    Лист-комп не может быть быстрее генератора, ибо лист-комп = отработавший до конца генератор + создание объекта класса лист с результатами данных полученных от генератора
    В данном случае листкомп быстрее ибо он сравнивается не с генератором, а с генератором обернутым в ( )
    То есть по сути тут сравнивается list comprehension и tuple comprehension

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

      Эээ, нет никакого tuple comprehension в природе. Если только явно обернуть в вызов tuple генератор, тогда да, но тут же нет такого, тут обычные генераторные выражения.

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

      @@CrazyElf1971 Вы правы

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

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

  • @Haponenko_Vadym
    @Haponenko_Vadym 2 роки тому +1

    Привет. Можно спросить не по теме видео?) Я вот пытаюсь парсить крипто сайты, но содержимое формирует JS код. Подскажи куда двигаться, чтобы максимально быстро захватить результат. Пробовал requests-html использовать, но после рендера результат тот же (без подгружаемого контента).

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

      Селениум. Есть бесплатный курс на канале

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

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

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

    я конечно нечего ещё не понимаю что тут сказано но было очень интересно

  • @AI_photo_styles
    @AI_photo_styles 2 роки тому +1

    Через пол года попросите чатгпт ускорить ваш код и он сам все оптимизирует. Пока только в лимит токенов упирается. А что будет если скомпилировать код? Будут ли вообще различия в скорости?

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

      Питон не компилируется

    • @albertvoi603
      @albertvoi603 Рік тому

      ​@@zproger питон можно компилить)

  • @brokeboy3
    @brokeboy3 2 роки тому +1

    успехов тебе, желаю в этом году набрать 1кк подписчиков)

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

      Спасибо, постараюсь набрать :D

  • @Ryhor1
    @Ryhor1 2 роки тому +1

    Я , конечно, не программист, но если надо обрабатывать миллион и более записей, то лучше использовать какую-нибудь sql базу данных, а там уже своя встроенная оптимизация запросов.

  • @Genkay_777
    @Genkay_777 Рік тому

    Еще быстрее код -
    def cycle_example():
    n = 999999
    total_sum = (n * (n + 1)) // 2
    print(total_sum)

  • @serdar6318
    @serdar6318 Рік тому

    Можно дулать просто list(range(1_000_000))
    Или может ваш пример как то лучше?

  • @braine7783
    @braine7783 2 роки тому +1

    Вот очень интересно, зачем такой масштаб? Вы с телефона кодите или что.

    • @zproger
      @zproger  2 роки тому +1

      Потому что есть люди которые смотрят с телефонов, и там ничего не видно с мелким шрифтом

  • @joehart7382
    @joehart7382 2 роки тому +1

    кем ты работаешь? Что за сборка линукса?

  • @IshuckShow
    @IshuckShow 2 роки тому +2

    Как хорошо, что теперь код к видео можно не самому писать, а с помощью чата генерить, да?)

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

      я это сам писал, что-то не совсем понял прикол)

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

      @@zproger он про chatGPT

  • @dicloniusN35
    @dicloniusN35 10 місяців тому

    а что быстрее крутится списки и циклы или pandas когда 1к + данных?

  • @marekplisiecki4835
    @marekplisiecki4835 2 роки тому +1

    Спасибо, я очень рад, обьяснение прекрасно.

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

      Благодарю

  • @NikNikNik74
    @NikNikNik74 2 роки тому +1

    А какая операционка у вас?

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

      Zorin OS

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

      @@zproger не хотели бы сделать на нее обзор с упором именно на ваши задачи?

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

    А как смотреть этот байткод? Я возможно прослушал в видео

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

    d = {1: 'foo', True: 'bar'}
    print(d) # {1: 'bar'}

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

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

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

      Возможно сделаю видео с тестами

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

      Потому что плюс генератора в занимаемой памяти, а не в скорости.

  • @Mike24ru
    @Mike24ru Рік тому

    Есть ощущение, что вся разница вовсе не от записи.
    При запуске, вы не можете гарантировать, что код получил процессорное время в момент старта, и на всё время выполнения, без пауз.
    Вспомните про gil, и как ос раздает время процессора.
    Итого. На 10⁶+ запусков цикла можно посмотреть среднее.
    Чтобы понять, есть ли смысл в этой оптимизации.
    И уже тогда думать, как городить тесты "в вакууме", для корректного сравнения.

  • @ЧувакИзКосмоса
    @ЧувакИзКосмоса 2 роки тому +1

    молодцом, парень, толково объясняешь

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

      Благодарю

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

    list(set[x for x in data if x is not None]) и такой вариант list({x for x in data if x is not None}]

  • @nikitatimofeenko9351
    @nikitatimofeenko9351 2 роки тому +1

    Фига питонисты узнали про функциональное программирование)))

  • @spaiktv3885
    @spaiktv3885 Рік тому

    а как в Пандасе циклов избежать. Особенно если используешь .loc ?

  • @enrewardronkhall8340
    @enrewardronkhall8340 Рік тому

    for key in dict работает быстрее чем for key in dict.keys(). Как я понял это потому что первое выражение использует кэшированные данные, когда как метод keys() возвращает генератор.

  • @Conigei
    @Conigei 2 роки тому +2

    Будет ли разница в скорости или затрате памяти если мы передадим глобальную переменную в функцию типо "def function(переменная)" или через global?

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

      не знаю, нужно тестировать :)

    • @justkrybik
      @justkrybik 2 роки тому +1

      А имеет ли это значение? В любом случае глобальная переменная намекает на проблемы в коде

    • @CrazyElf1971
      @CrazyElf1971 2 роки тому +1

      Поскольку все большие объекты передаются по ссылке, то разницы не должно быть вообще. И то и другое просто ссылка.

    • @vas_._sfer6157
      @vas_._sfer6157 2 роки тому +1

      @@CrazyElf1971 В питоне даже числа передаются по ссылке.

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

    зачем использовать enumerate, когда нужны одни значения?
    обычный итератор по значениям будет быстрее: for v in numbers: temp += v
    ну а лучше вообще так: for v in range(1_000_000): temp += v
    а еще лучше так: sum(range(1_000_000))
    в последнем примере быстрее всего будет вообще так (кстати, используется генератор):
    print(sum(value for action, value in user_buy if action == "confirmed"))
    и это быстрее, чем использование списка (я уж молчу про использование памяти):
    print(sum([value for action, value in user_buy if action == "confirmed"]))

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

    как лучше писать рекурсию: через math, рекурсию, или через фор?

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

    Если уж до конца идти, то что в первом примере не сделать sum(range(1_000_000))?
    Ну или (1_000_000 * (1_000_000 + 1)) // 2 - 1_000_000?

  • @АндрейКолесников-и5п

    А в зависимости от железа один и тот же код, например на разных процессорах может выполняться разное время? Например процессоры с разными наборами инструкции?

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

      Даже более того, в разных версиях питона один код может довольно разное время исполняться.

  • @ilyakuzminov8127
    @ilyakuzminov8127 2 роки тому +2

    Если количество итераций цикла поставить 10**10 или 10000000000, первый вариант будет работать медленнее)

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

    Привет. Я новый подписчик и всего 2 года изучаю все это. Сейчас перешел на линукс. Расскажи пожалуйста, как ты сделал или собрал себе code oss

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

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

  • @Kaliamba
    @Kaliamba Рік тому

    чтобы записи были быстрее надо сменить раскладку с "py" на "c++", и тогда уже можно обложиться костылями и летать всё будет как боинг

  • @mrBars1kChannel
    @mrBars1kChannel 10 місяців тому

    Странно, я повторил первый пример и на проверке значения range в 100 миллионов, у меня выходит:
    Цикл: 8.467104000039399 сек,
    sum: 8.498224299983121 сек
    То есть, цикл оказывается быстрее.
    Но если указать значение в 200 миллионов, то картина меняется на противоположную и sum оказывается быстрее:
    Цикл: 17.2555661998922
    sum: 16.959907999960706
    Теперь sum побеждает.
    Проверял множество раз, соотношение и тенденция остаётся таким же
    upd: проверил на сотнях повторений и усреднении через timeit, цикл почти всегда побеждает по скорости. Хотя я прям в точности повторил и перепроверил. Да и тут сложно ошибиться... Очень странно

    • @hsqlk
      @hsqlk 10 місяців тому +1

      Цикл фактически написан на C/C++ поэтому он должен быстрее работать
      P.S. Может ошибаюсь, но это точно связано с C/C++

    • @Meowta
      @Meowta Місяць тому

      Отвечаю поздно, но sum тоже на С, а for частично
      ​@@hsqlk

  • @Feraklin
    @Feraklin 2 роки тому +8

    Есть одна проблема, когда без индекса не обойтись - когда вы планируете изменить значения в списке. И enumerate и проход по элементам создают копию, с которой вы работаете, сам элемент не меняется

    • @CrazyElf1971
      @CrazyElf1971 2 роки тому +7

      Но при этом enumerate даёт вам и индекс элемента, вы можете этим индексом воспользоваться, чтобы поменять значение в списке.

  • @QwDragon
    @QwDragon 2 роки тому +5

    Используйте встроенные функции, а в коде [num for num in range(1000)] вместо list(range(1000)), причём это заполнение ещё и в замер попадает.
    И вообще, сумма рейнджа решается формулой.

  • @andrewbondaryuk
    @andrewbondaryuk Рік тому

    Это код который пишет junior----- ?
    collections вам в помощь!
    Циклы только тогда, когда не справляется collections.

  • @artemsergeev3730
    @artemsergeev3730 2 роки тому +2

    Оказывается для получения суммы элементов не надо писать цикл - афигеть! Вот это новость!

    • @zproger
      @zproger  2 роки тому +1

      Не забывайте о новичках

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

      да можно вообще через reduce + lambda на сумму захерачить )))

  • @gralex80
    @gralex80 2 роки тому +1

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

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

      Пример можете написать ?

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

      чем лучше?

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

      @@Keefear def time_counter(func):
      def inner(*args, **kwargs):
      start_t = time.time_ns()
      func(*args, **kwargs)
      end_t = time.time_ns()
      res = end_t - start_t
      print(f'execution time of {func.__name__}: {res} ns')
      return inner

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

      @@justkrybik Да просто удобнее и меньше кода нужно

  • @min_way
    @min_way Рік тому

    а зачем писать num for num in range() если то же самое возвращает просто функция range()

  • @IT_psychopath
    @IT_psychopath Рік тому

    разница в том что мат либы написаны на С++ и скомпилированы! еще они заранее оптимизированы! так устроен python. даже ели вы тоже напишите на С++ то либа python скорее всего будет все ровно быстрее. еще не затронули тему памяти! разные подход по разному используют память. и это реально важно. хотите очень быстрый цикл пишите его на next. и у вас будет реально очень быстрое решение. писать циклом или использовать либу, зависит строго от задачи! просто сказать тип - "либа круче!" это уровень джуна.. нет понятие "так лучше" или "так хуже!", бывает задача и ее решение.)) вроде тут оптимизирует но там дальше из-за этого подхода может все остановиться и задержка вырастит или наоборот упадет. память выжрет к примеру и ПО подвиснет, зато быстро.))))

  • @sergeykot6874
    @sergeykot6874 5 місяців тому

    Во втором примере получил результат, противоположній результату автора:
    9999999
    time: 1.33
    9999999
    time: 1.49
    Возможно, у меня более поздняя версия Python, в которой доступ по индексу оптимизирован?

  • @ИгорьСуслов-и9р

    Есть классная книжка по такого рода приколам питона, называется Python Cookbook, автор Дэвид Бизли. Там прям рецепты решения всяких задач описаны. Один из советов, изучить встроенную либу collections,

  • @dima.kasper
    @dima.kasper 2 роки тому +1

    Давай видос про всю мощь much case и её отличие от простых if elif else.

    • @zproger
      @zproger  2 роки тому +1

      Спасибо, сделаю

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

      олень безграмотный, "much case" аахахха

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

    [num for num in range(10_000)] медленнее, больше по размеру, больше по байт коду, чем просто [*range(10_000)] или list(range(10_000))

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

      Кстати, да. Всегда когда пишется код "[x for x in ..." его обычно можно заменить на более оптимальный код.

  • @seoonlyRU
    @seoonlyRU 2 роки тому +2

    лайк от профи по патону - от СЕООНЛИ

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

      Спасибо

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

    Проверил 2 пример из видео - доступ к элементам списка по индексу. По производительности enumerate самый не производительный способ. Python 3.11.1
    Рейтинг получился такой:
    1) "for num in numbers:"
    2) "for num in range(len(numbers)):"
    3) "for index, num in enumerate(numbers):"

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

      Ну потому что два вида объектов так перебирается - и индекс и объекты списка. Но если обе эти сущности используются внутри цикла, то enumerate просто удобен и понятен.

  • @MAKSIMILIN-h8e
    @MAKSIMILIN-h8e Рік тому

    Думаю, народ запускает цикл на суммированием когда нужно использовать оператоh if , разбери пример использования sum map lambda filter

  • @timutgin
    @timutgin Рік тому

    Что если в случаях когда нужен индекс вместо enumerate использовать просто счетчик, например index = 0 , а в цикле index+=1?

    • @vryaboshapko
      @vryaboshapko Рік тому

      Итерироваться через for, но увеличивать индекс, заданный вне цикла? Полагаю, по производительности сопоставимо с enumerate, но выглядеть это будет очень грязно.

  • @scv3l684
    @scv3l684 2 роки тому +1

    Почему не используешь python 11?

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

      лень обновлять :D

  • @kumoist
    @kumoist 2 роки тому +1

    Мне кажется или вы многовато говорите для человека с именем канала Z proger

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

      во-первых ZProger если уже на то пошло, во-вторых этому нику 3 года,
      во-третьих канал о программировании, и не нужно сюда приписывать свою политику

  • @devosaurusalt
    @devosaurusalt 2 роки тому +1

    Если реально за производительность - идите в плюсы

  • @mindflay6431
    @mindflay6431 Рік тому

    Посыл у автора верный - имея возможность стоит всегда делать выбор в пользу коробочных функций, так как их уже оптимизировали до нас + проверять постулаты на достоверность. Но сама подача материала просто пиздец. Делаем тесты на ОДНОМ замере Карл... А еще история с "байт кодом" позабавила. Возможно, автор понимает что там написано (ощущение что нет), но делать выводы исходя только из количества инструкций это конечно топ. Так сказать разбор от бога.

  • @sashasashovic91
    @sashasashovic91 2 роки тому +1

    Есть формула n/2*(n+1), n>= 2

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

      Благодарю

  • @giper4403
    @giper4403 2 роки тому +2

    Мораль - не изобретайте велосипед. Учите встроенные функции (хотя бы читайте).