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

แชร์
ฝัง
  • เผยแพร่เมื่อ 23 ธ.ค. 2024

ความคิดเห็น • 356

  • @splinter928
    @splinter928 ปีที่แล้ว +112

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

    • @zproger
      @zproger  ปีที่แล้ว +18

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

    • @splinter928
      @splinter928 ปีที่แล้ว +43

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

    • @dmitriyneledva4693
      @dmitriyneledva4693 ปีที่แล้ว +2

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

    • @zaza2258
      @zaza2258 ปีที่แล้ว

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

    • @victorpetchenev4119
      @victorpetchenev4119 ปีที่แล้ว +11

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

  • @berlin3589
    @berlin3589 ปีที่แล้ว +93

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

  • @johnjonson4641
    @johnjonson4641 ปีที่แล้ว +4

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

    • @zproger
      @zproger  ปีที่แล้ว +1

      Спасибо

  • @Python-i2z
    @Python-i2z 3 หลายเดือนก่อน +2

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

    • @zproger
      @zproger  3 หลายเดือนก่อน +2

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

  • @MrPalianytsia
    @MrPalianytsia ปีที่แล้ว +6

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

  • @_M.i.h.a.i.l._
    @_M.i.h.a.i.l._ ปีที่แล้ว +58

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

    • @13-th_Lord
      @13-th_Lord 9 หลายเดือนก่อน +3

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

    • @ultracolor
      @ultracolor 9 หลายเดือนก่อน +1

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

    • @s4ndstrm378
      @s4ndstrm378 9 หลายเดือนก่อน

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

    • @xxxbunx
      @xxxbunx 8 หลายเดือนก่อน

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

  • @WertiGo260990
    @WertiGo260990 ปีที่แล้ว +42

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

    • @АнтонЕсипенко-м2н
      @АнтонЕсипенко-м2н ปีที่แล้ว +17

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

    • @Dvoechnik2
      @Dvoechnik2 ปีที่แล้ว +10

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

    • @beardedman721
      @beardedman721 ปีที่แล้ว +1

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

    • @КириллЧе-я5ы
      @КириллЧе-я5ы 11 หลายเดือนก่อน

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

    • @blacter7152
      @blacter7152 12 วันที่ผ่านมา

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

  • @metasy_
    @metasy_ ปีที่แล้ว +4

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

  • @Dmitrii-Zhinzhilov
    @Dmitrii-Zhinzhilov ปีที่แล้ว +3

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

    • @zproger
      @zproger  ปีที่แล้ว +1

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

  • @tamirlanmakhov5027
    @tamirlanmakhov5027 ปีที่แล้ว +5

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

    • @zproger
      @zproger  ปีที่แล้ว +2

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

  • @АндрейСойко-р6п
    @АндрейСойко-р6п ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Благодарю

  • @vz2503
    @vz2503 ปีที่แล้ว +1

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

  • @non5309
    @non5309 ปีที่แล้ว +15

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

  • @rusnickk
    @rusnickk ปีที่แล้ว +1

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

  • @Ju8Sho
    @Ju8Sho ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว +1

      ZorinOS

    • @Ju8Sho
      @Ju8Sho ปีที่แล้ว

      Спасибо

  • @aweryc
    @aweryc ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Благодарю

  • @Vednier
    @Vednier 3 หลายเดือนก่อน

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

  • @ttarnkfufts
    @ttarnkfufts ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Vs Code

    • @ttarnkfufts
      @ttarnkfufts ปีที่แล้ว

      @@zproger благодарю.

  • @backdownof
    @backdownof ปีที่แล้ว +2

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

  • @Alcoholdehydrogenas
    @Alcoholdehydrogenas 10 หลายเดือนก่อน

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

  • @pfomrak
    @pfomrak ปีที่แล้ว +3

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

    • @zproger
      @zproger  ปีที่แล้ว

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

  • @coldssielens161
    @coldssielens161 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว +1

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

  • @ДанилЗиновьев-ы5х
    @ДанилЗиновьев-ы5х ปีที่แล้ว +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

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

    • @ГлавнаяМразьЮтуба-ц5я
      @ГлавнаяМразьЮтуба-ц5я ปีที่แล้ว +1

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

  • @serdar6318
    @serdar6318 ปีที่แล้ว

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

  • @__init__.
    @__init__. ปีที่แล้ว +1

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

  • @шелбичные-нарезки
    @шелбичные-нарезки ปีที่แล้ว +2

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

  • @dzen1208
    @dzen1208 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว +1

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

  • @fahrenheit1863
    @fahrenheit1863 ปีที่แล้ว +1

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

  • @lolzplaysofficial6883
    @lolzplaysofficial6883 หลายเดือนก่อน

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

  • @КириллЧе-я5ы
    @КириллЧе-я5ы 11 หลายเดือนก่อน

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

  • @python6278
    @python6278 ปีที่แล้ว

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

  • @Георгий-ц6с3п
    @Георгий-ц6с3п ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

  • @dicloniusN35
    @dicloniusN35 9 หลายเดือนก่อน

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

  • @pbashkatov
    @pbashkatov ปีที่แล้ว

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

  • @Haponenko_Vadym
    @Haponenko_Vadym ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

    • @Haponenko_Vadym
      @Haponenko_Vadym ปีที่แล้ว

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

  • @ismailisabekov8424
    @ismailisabekov8424 ปีที่แล้ว +2

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

    • @ismailisabekov8424
      @ismailisabekov8424 ปีที่แล้ว +1

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

    • @nakidai
      @nakidai ปีที่แล้ว

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

    • @ismailisabekov8424
      @ismailisabekov8424 ปีที่แล้ว +1

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

    • @kirill12340
      @kirill12340 ปีที่แล้ว

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

  • @Limon12rus13
    @Limon12rus13 ปีที่แล้ว +6

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

    • @cdgAxel
      @cdgAxel ปีที่แล้ว +1

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

  • @kirill_nedobmxer1599
    @kirill_nedobmxer1599 ปีที่แล้ว

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

  • @spaiktv3885
    @spaiktv3885 ปีที่แล้ว

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

  • @vladimirdo
    @vladimirdo ปีที่แล้ว

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

  • @АлександрКоновалов-ш1н
    @АлександрКоновалов-ш1н ปีที่แล้ว +1

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

    • @vas_._sfer6157
      @vas_._sfer6157 ปีที่แล้ว

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

  • @уберменш
    @уберменш ปีที่แล้ว

    3:50
    lst = [choice(ascii_letters + digits + punctuation) for i in range(100_000_000)]
    t1 = time()
    for i in range(len(lst)):
    a = lst[i]
    print("Обращение по индексу и range:", time() - t1)
    t1 = time()
    for i, val in enumerate(lst):
    a = val
    print("Enumerate", time() - t1)
    не знаю почему, но у меня выдает следующие значения:
    Обращение по индексу и range: 4.414041996002197
    Enumerate 5.103984832763672
    То есть enumerate медленнее, а в видео наоборот, может из-за того что я пишу на pycharme, а вы в vs code?

    • @human6885
      @human6885 ปีที่แล้ว +1

      идешки вроде не влияют на скорость выполнения кода

  • @marekplisiecki4835
    @marekplisiecki4835 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Благодарю

  • @timutgin
    @timutgin ปีที่แล้ว

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

    • @vryaboshapko
      @vryaboshapko ปีที่แล้ว

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

  • @dmitry-lz1ny
    @dmitry-lz1ny ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

  • @Mr_AnKei
    @Mr_AnKei ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      😎 😎

    • @Mr_AnKei
      @Mr_AnKei ปีที่แล้ว

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

  • @AI_photo_styles
    @AI_photo_styles ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

    • @albertvoi603
      @albertvoi603 10 หลายเดือนก่อน

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

  • @mak32
    @mak32 ปีที่แล้ว +9

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

    • @mak32
      @mak32 ปีที่แล้ว +1

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

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว

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

    • @zproger
      @zproger  ปีที่แล้ว

      Спасибо

    • @mikeofs1304
      @mikeofs1304 ปีที่แล้ว +1

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

    • @MT-mv1qw
      @MT-mv1qw ปีที่แล้ว +1

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

  • @Conigei
    @Conigei ปีที่แล้ว +2

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

    • @zproger
      @zproger  ปีที่แล้ว

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

    • @justkrybik
      @justkrybik ปีที่แล้ว +1

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

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว +1

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

    • @vas_._sfer6157
      @vas_._sfer6157 ปีที่แล้ว +1

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

  • @cdgAxel
    @cdgAxel ปีที่แล้ว

    зачем использовать 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"]))

  • @mrBars1kChannel
    @mrBars1kChannel 9 หลายเดือนก่อน

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

    • @hsqlk
      @hsqlk 8 หลายเดือนก่อน +1

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

  • @NikNikNik74
    @NikNikNik74 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Zorin OS

    • @NikNikNik74
      @NikNikNik74 ปีที่แล้ว

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

  • @archie-blend
    @archie-blend ปีที่แล้ว +18

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

    • @z.dekuch1987
      @z.dekuch1987 ปีที่แล้ว +5

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

    • @b213videoz
      @b213videoz ปีที่แล้ว +6

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

    • @ultracolor
      @ultracolor 9 หลายเดือนก่อน

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

    • @artyommakovskiy8974
      @artyommakovskiy8974 6 หลายเดือนก่อน

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

  • @enrewardronkhall8340
    @enrewardronkhall8340 ปีที่แล้ว

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

  • @dmitriyneledva4693
    @dmitriyneledva4693 ปีที่แล้ว +3

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

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว +3

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

    • @dmitriyneledva4693
      @dmitriyneledva4693 ปีที่แล้ว

      @@CrazyElf1971 Вы правы

  • @joehart7382
    @joehart7382 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      ZorinOS

  • @andrewbondaryuk
    @andrewbondaryuk ปีที่แล้ว

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

  • @daniilborsh
    @daniilborsh ปีที่แล้ว +2

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

    • @arkptz1607
      @arkptz1607 ปีที่แล้ว +1

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

  • @nilmdreik
    @nilmdreik ปีที่แล้ว

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

    • @nilmdreik
      @nilmdreik ปีที่แล้ว

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

  • @gralex80
    @gralex80 ปีที่แล้ว +1

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

    • @Keefear
      @Keefear ปีที่แล้ว

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

    • @justkrybik
      @justkrybik ปีที่แล้ว

      чем лучше?

    • @sergeybabyak7050
      @sergeybabyak7050 ปีที่แล้ว

      @@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 ปีที่แล้ว

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

  • @АндрейКолесников-и5п
    @АндрейКолесников-и5п ปีที่แล้ว

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

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว

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

  • @brokeboy3
    @brokeboy3 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

  • @felorez7403
    @felorez7403 ปีที่แล้ว +2

    Ура! Новая видео

    • @zproger
      @zproger  ปีที่แล้ว +1

      😉

  • @ЧувакИзКосмоса
    @ЧувакИзКосмоса ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Благодарю

  • @braine7783
    @braine7783 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว +1

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

  • @Feraklin
    @Feraklin ปีที่แล้ว +8

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

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว +7

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

  • @min_way
    @min_way ปีที่แล้ว

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

  • @scv3l684
    @scv3l684 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

  • @Blecord
    @Blecord ปีที่แล้ว +3

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

    • @zproger
      @zproger  ปีที่แล้ว

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

    • @flikos
      @flikos ปีที่แล้ว

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

  • @УголокКодера
    @УголокКодера ปีที่แล้ว +2

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

  • @notMails
    @notMails ปีที่แล้ว +2

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

  • @Mike24ru
    @Mike24ru 11 หลายเดือนก่อน

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

  • @QwDragon
    @QwDragon ปีที่แล้ว +5

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

    • @Lokamp_
      @Lokamp_ ปีที่แล้ว

      можно пример формулы?

    • @ЕвлампийСтоеросов
      @ЕвлампийСтоеросов ปีที่แล้ว

      @@Lokamp_ищи "сумма членов арифметической прогрессии"

  • @wasd1338
    @wasd1338 ปีที่แล้ว

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

  • @ruslansanzharov5825
    @ruslansanzharov5825 ปีที่แล้ว

    2:57 написано for i in number, а массив называется numbers

  • @Zatrit
    @Zatrit ปีที่แล้ว

    Почему у тебя в первом примере используется создание списка, если это не так экономно в плане использования памяти, как просто sum(range(1_000_000))?

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว +1

      Я так понял, это чтобы сравнить работу кода уже с готовым произвольным списком. Так то если бы именно такую сумму нужно было посчитать, то так быстрее. А ещё быстрее взять формулу и посчитать эту сумму через пару арифметических действий, без суммирования элементов списка.

  • @serufim
    @serufim ปีที่แล้ว +2

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

  • @FoxInGlases
    @FoxInGlases ปีที่แล้ว +1

    а что за IDE?

  • @dima.kasper
    @dima.kasper ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว +1

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

    • @nicholasspezza9449
      @nicholasspezza9449 ปีที่แล้ว

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

  • @IT_psychopath
    @IT_psychopath ปีที่แล้ว

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

  • @ilyakuzminov8127
    @ilyakuzminov8127 ปีที่แล้ว +2

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

  • @ysopol1
    @ysopol1 ปีที่แล้ว

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

  • @АлександрВолков-ч6г1ч
    @АлександрВолков-ч6г1ч ปีที่แล้ว

    Запускал 2 тест раз 5, странно, но enumerate всегда немного уступал(Python 3.11)

  • @Ryhor1
    @Ryhor1 ปีที่แล้ว +1

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

  • @Ivan-jh6cv
    @Ivan-jh6cv ปีที่แล้ว +1

    В первом примере слишком большое влияние оказывает наличие инициализации numbers в функции. Вот что будет, если этот список передавать аргументом:
    499999500000
    time: 0.00261
    499999500000
    time: 0.02129
    Результаты не в том порядке, что в видео (сперва вариант через sum, потом через цикл).

  • @nikitatimofeenko9351
    @nikitatimofeenko9351 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Да :D

  • @YanchikDev
    @YanchikDev ปีที่แล้ว

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

  • @ИгорьСуслов-и9р
    @ИгорьСуслов-и9р ปีที่แล้ว

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

  • @Smbrine
    @Smbrine ปีที่แล้ว

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

  • @nurlashka17
    @nurlashka17 ปีที่แล้ว +2

    Лучший!

    • @zproger
      @zproger  ปีที่แล้ว

      Спасибо 😉

  • @kumoist
    @kumoist ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

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

  • @sergeykot6874
    @sergeykot6874 4 หลายเดือนก่อน

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

  • @108holyspirit
    @108holyspirit ปีที่แล้ว +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 ปีที่แล้ว

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

  • @Malifiik
    @Malifiik ปีที่แล้ว

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

  • @ririol
    @ririol ปีที่แล้ว +1

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

  • @sashasashovic91
    @sashasashovic91 ปีที่แล้ว +1

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

    • @zproger
      @zproger  ปีที่แล้ว

      Благодарю

  • @sbm31337
    @sbm31337 ปีที่แล้ว

    давай 4 файл на map/reduce

  • @Genkay_777
    @Genkay_777 ปีที่แล้ว

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

  • @warpmaster
    @warpmaster ปีที่แล้ว

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

    • @CrazyElf1971
      @CrazyElf1971 ปีที่แล้ว

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

  • @IshuckShow
    @IshuckShow ปีที่แล้ว +2

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

    • @zproger
      @zproger  ปีที่แล้ว

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

    • @sergeybabyak7050
      @sergeybabyak7050 ปีที่แล้ว

      @@zproger он про chatGPT