Тёмный

Самый БЫСТРЫЙ стандартный цикл Python − Интеграция с языком Си 

ZProger [ IT ]
Подписаться 110 тыс.
Просмотров 83 тыс.
50% 1

⭐ Курс ООП и Приват канал: www.zproger-school.com/?...
⭐ Телеграм канал: t.me/+5MtrfQnCi4Q1Yjlh
В данном видео мы узнаем какой цикл в Python самый быстрый.
Рассмотрим что быстрее: for или while?
Найдем причину и также ускорим циклы по максимуму используя технологии из видео.
📁 Github: github.com/Zproger
📁 Все плейлисты с уроками: bit.ly/39GaY89
📁 Связаться со мной: zproger777@gmail.com
📁 Поддержать криптовалютой: github.com/Zproger/donate

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

 

29 июл 2022

Поделиться:

Ссылка:

Скачать:

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

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 226   
@drimmwald4483
@drimmwald4483 Год назад
Хочешь ускорить python, пиши на С, как то так я понял это видео)
@zproger
@zproger Год назад
=)
@Grey_Slime
@Grey_Slime 2 месяца назад
Или на ассемблер
@artemnemcov448
@artemnemcov448 Год назад
Видео по ctypes будет круто увидеть! Годный контент, давно была идея объединить с и Пайтон, но казалось сложной затеей, спасибо!
@m0Ray79
@m0Ray79 Год назад
Welcome to Cython. У меня есть пара видосиков на эту тему.
@user-di7jx3or6f
@user-di7jx3or6f Год назад
Разница все же небольшая есть в начальных циклах while и for: - в цикле while выполняется увеличение значения переменной "result" на 1 - в цикле for выполняется увеличение значения переменной "result" на значение переменной "num" Другими словами, функции loop1() и loop2() вернут разные значения.
@chinchita5532
@chinchita5532 Год назад
И в первой функции 2 сложения, когда во второй одно
@guiterenzog2723
@guiterenzog2723 Год назад
Тоже не понял, в чем суть. Пару раз пересмотрел, пытаясь понять, что я не так понял. Оказывается, все я правильно понял.
@01011968Desgner
@01011968Desgner Год назад
@@chinchita5532 + там еще на каждой итерации - операция проверки условия num < value
@64dusk
@64dusk Год назад
Для получения одинакового значения нужно изменить: num += 1 result += num
@zproger
@zproger Год назад
Да есть такое, только сейчас заметил что случайно эту переменную подставил 😐
@munzamt
@munzamt Год назад
Quick review: самый быстрый способ итерировать в пайтон - не итерировать в пайтон. Ты использовал разные функции: где-то ты считал сумму чисел до ста миллионов, а где-то количество чисел до ста миллионов. Вещи разные, и потому как интерпритатор пайтон, так и компилятор gcc будут по разному оптимизировать код. С большой долей вероятности, gcc съел весь твой цикл, так как увидел константные литералы и цикл по ним, и выдал предкомпилированный ответ.
@jetbrain9115
@jetbrain9115 Год назад
Слушай, реально)
@Anatolii_V_Novikov
@Anatolii_V_Novikov Год назад
Да, потому что надо сумму в конце выводить на экран, и тогда он не съест. Плюс не забыть поставить опцию компиляции -O2 :)
@Fleshvinn
@Fleshvinn Год назад
Щас бы в первом цыкле увеличивать на 1 а во втором на арефметичческую прогресию ... автор гений
@Fleshvinn
@Fleshvinn Год назад
ну и далее по тексту: зачем в первом цыкле переменная num если тебе не важна какая итерация - while result
@artemqqq7153
@artemqqq7153 Год назад
Мне кажется в первом цикле он допустил опечатку: он имел ввиду result+=num
@SeregaE75
@SeregaE75 Год назад
Хороший контент👍 Спасибо!
@zproger
@zproger Год назад
😉
@MihailOnuchin
@MihailOnuchin Год назад
Не хватает действительно самого быстрого варианта - суммы арифметической прогрессии )
@user-hp4xw2oe9t
@user-hp4xw2oe9t Год назад
Легко делается
@blackcatdevel0per
@blackcatdevel0per Год назад
Ещё можно сделать низкоуровневых цикл бинарными операторами(но я в этом особо не шарю 😅)
@artemetra3262
@artemetra3262 Год назад
@@blackcatdevel0per разве что заменить деление на два на >>
@Filmy_HD
@Filmy_HD Год назад
Круто!)
@nickolayarbuzov6149
@nickolayarbuzov6149 Год назад
это очень круто ! спасибо за видео
@zproger
@zproger Год назад
😉
@user-kv5oh9ex4f
@user-kv5oh9ex4f Год назад
В цикле while Вы не вычисляете sum(range(value), Вы только увеличиваете rezult+=1, а в цикле for Вы действительно вычисляете sum(range(value). Сравнение не совсем корректно.
@nekomantia
@nekomantia Год назад
Спасибо! Про подключение сишных библиотек очень интересно
@vlad3c
@vlad3c Год назад
Забавное видео, я не знаком с питоном совсем, чего не скажу про си. Так вот разница в них в том, что питон это интерпретируемый язык, а си - компилируемый. И скорость выполнения циклов такая потому что в си есть компилятор и такие циклы он оптимизирует на раз, даже без флага -o3 (максимальная оптимизация), т.е. весь цикл фактически уменьшился до строчки result = value. поэтому время выполнения и занимало 0-1с, никакой магии тут нет. чтобы программа честно пробегала миллион итераций можно добавить спецификатор volatile для переменной result или i, это укажет компилятору, что эта переменная может измениться вне программы и оптимизировать ее нельзя, т.е. программа каждый раз будет вызывать эту переменную из ПАМЯТИ при каждом обращении, что усложняет задачу и сравнивать такой цикл с питоновским неверно, т.к. итераторы скорее всего программа будет держать в регистре, а не в памяти, что так же увеличивает скорость работы программы! И да нет разницы между циклами for и while в целом (на Асемблере) и в частности в си, в самом начале языка Си цикла for не было вообще и не зря надо написать for(;;) чтобы запустить бесконечный цикл, я думаю это типо глобального макроса, который раскрывается в while по итогу, и при переводе на ассемблер команды не меняются ни при for ни при while, меняется лишь "интерфейс" для программиста. Дальше идут мои предположения, не претендующие на истину в 10 инстанции! В питоне разница же происходит, как ты правильно сказал за счет того, что range написан на Си, т.е. на строго типизированном языке, поэтому команды num += 1 на Си и Питоне будут выполняться за разное время, т.к. на Си это всегда переменная определенного типа, а в питоне нет, поэтому под капотом команды num +=1 интерпретатор сначала смотрит что за тип был, какой тип мы плюсуем и выполняет команду и в цикле while он делает это каждый раз для двух переменных num и result, в цикле for он это делает 1 раз для переменной num, и каждый раз для переменной result. Хотя могу ошибаться тут, т.к. питон не изучал...
@user-bw5in2yo7s
@user-bw5in2yo7s Год назад
Попробуйте return (i * (i - 1)) // 2 Numpy - очень крутая библиотека. Лежит в основе кучи фреймворков для дата-аналитики и ML. Вот только arange(100000000) аллоцирует соответственно бооооольшой блок в памяти. А для быстрых вычислений, кстати, можно ещё Numba или что-то другое с JIT-компиляцией использовать. А если ещё и с распределенными вычислентями на видеокарте... Мммм пушка-гонка))
@WS_Coder
@WS_Coder Год назад
Глубокомысленно, хорошо, интересно Спасибо
@user-lp1ir6qr2w
@user-lp1ir6qr2w Год назад
5:50 если совсем коротко, в Си for появился просто для упрощения работы программистов (синтаксический сахар), на деле же грубо говоря это просто обёртка цикла while. Ну, не с помощью LOOP циклы реализовываем, и на том спасибо)
@vladimirastrelin1719
@vladimirastrelin1719 Год назад
круто...спасибо !
@user-yk2zc8vy6u
@user-yk2zc8vy6u Год назад
Если расскажешь о методах ускорения питона с помощью си это будет огонь! Не знал, что можно писать свои модули на си, теперь появилось много разных мыслей/идей Спасибо!)
@m0Ray79
@m0Ray79 Год назад
Гораздо проще на Pyrex/Cython. Я рассказал.
@user-yk2zc8vy6u
@user-yk2zc8vy6u Год назад
@@m0Ray79 спасибо за инфу, надо изучить)
@stepan109
@stepan109 Год назад
Очень нужно видео о том, как передавать/забирать из си переменные в питон
@ukrainetoday960
@ukrainetoday960 8 месяцев назад
Кидай через файлы)
@vlatterran
@vlatterran Год назад
Как сказал ещё mCoding: Самый быстрый способ писать циклы в питоне - не писать циклы в питоне Если вам нужна скорость в питоне - не используйте питон
@domochevsky4703
@domochevsky4703 Год назад
Реально крутые видосы Смотрю с удовольствием
@artemqqq7153
@artemqqq7153 Год назад
В первом цикле опечатка (10 строка), вы наверное имели ввиду result+=num чтобы там была прогрессия
@c1vgk
@c1vgk Год назад
Спасибо за твои видосы, да было бы хорошо посмотреть про библеотеку numpy
@user-pf3qw1nf6e
@user-pf3qw1nf6e Год назад
Круто!
@zproger
@zproger Год назад
😉
@Minas__Morgul
@Minas__Morgul Год назад
вот прям спасибо!
@zproger
@zproger Год назад
😉
@NirrBell
@NirrBell Год назад
def loop1(num = value): result = 0 while num: result += num num -=1 return result print(t()) на 28% быстрее вашего whil'a считает
@master8920
@master8920 Год назад
Написал комент на средине, но когда досмотрел до конца это просто огненно 🔥 Продолжай 👊🤝
@zproger
@zproger Год назад
Спасибо 🔥
@Anatolii_V_Novikov
@Anatolii_V_Novikov Год назад
На С неважно for или while, все примерно одинаково работают по скорости выполнения. Но чтобы на С корректно замерить время выполнения цикла, надо итоговую сумму в конце вывести на экран, тогда компилятор сделает честный код. При этом важно поставить опцию компиляции -O2 (можно и -O3). Однако, если у Вас простейший инкремент, то умный компилятор может свернуть его самостоятельно вне зависимости от вывода результата на печать :) Возможно, лучше тестировать сумму арифметической прогрессии, чтобы компилятор не смог распознать зависимость. На С/С++ легко наступить на грабли и требуется некоторое время на составление корректного теста.
@user-pg8ry1tm3t
@user-pg8ry1tm3t 5 месяцев назад
Только благодаря усилиям компиляторе🥴 так то прыгающие ифовые инструкции в форе дадут неплохую просадку. И вроде как вайл здесь спасение. Но вот в дело вступит оптимизатор компайла и вся оптимизация в выборе цикла ни о чем🥴
@lllbenderlll
@lllbenderlll Год назад
Цикл фор в си сделай по другому: for(int i=big_num; i; --i){ /*do your stuff*/ } так будет на 10-20% быстрее Все дело в том что на ассемблере у тебя генерится сравнение в виде операции cmp которая автоматически генерит флаг состояния по все видам сравнения (> < и ТД и та) и потом генерится код с необходимым джампом. Если по моему то просто проверка на (не ноль) при флаге -О3. Есть ещё более извратный вариант: for(int i=big_num/4; i; --i){ /*do your stuff 1*/ /*do your stuff 2*/ /*do your stuff 3*/ /*do your stuff 4*/ } for(int i=big_num%4; i; --i){ /*do your stuff*/ } итоговая производительность должна возрасти в 2раза минимум Насчёт ситайпс - сделай. Развлекайся)))
@user-zg2pf5rt7q
@user-zg2pf5rt7q Год назад
"итоговая производительность должна возрасти в 2раза минимум" Итоговая производительность в первую очередь зависит от тела цикла. В большинстве реальных задач затраты на итерирование на порядки меньше затрат на выполнение тела цикла. Первый вариант, с обратным итерированием в реальности будет применим далеко не всегда. Про второй лучше вообще не упоминать.
@artembagachkov933
@artembagachkov933 Год назад
Та ты гений! Превью видео даже не преувеличено, а так как есть, лови респект
@zproger
@zproger Год назад
😎
@CalmVideo
@CalmVideo Год назад
Очень полезно
@zproger
@zproger Год назад
Благодарю!
@user-us8de9yk2c
@user-us8de9yk2c Год назад
Неоднозначное видео. Автор, естественно, не врёт, особенно если понять, что во второй функции просто небольшая опечатка. Там нужно убрать у result += num знак плюса, вы получите похожие значения. Т.е. название видео полностью оправданно, при работе с пайтоном нужно помнить, где можно сэкономить время. Но с другой стороны важно понимать принципиальную разницу двух циклов. В данной ситуации вы просто пытаетесь использовать цикл while взамен цикла for. Однако они имеют разное значение в программировании. While изначально не подразумевает работу с такими большими значениями, и он работает непосредственно с true и false, т.е. входные параметры можно сделать любые, сравнивать хоть текст, хоть логическое, хоть цифру. А цикл с параметром изначально задуман как счётчик. Можно ли заменять эти циклы друг другом? Да. Но зачем? В теории можно ходить на руках и брать ногами вилку. Но есть ли в этом смысл? Не думаю.
@Iva666ka
@Iva666ka Год назад
Вывод времени ровно 0 секунд или ровно 1 секунду или ровно 2 секунды намекает, что код обрабатывает разницу между промежутками времени как int, поэтому точность измерения до 0,9(9) секунд.
@lmaootakedh
@lmaootakedh Год назад
спс, полезно
@zproger
@zproger Год назад
Спасибо
@zluka7951
@zluka7951 Год назад
Привет, спасибо за видео. Используешь ли пайчарм? Стоит ли к нему привыкать заранее даже тогда, когда весь его функционал не нужен, или считаешь лучше на него пересаживаться только по надобности?
@zproger
@zproger Год назад
Использую. Тут кому как, надо отталкиваться от потребностей, некоторым и на виме норм
@predatel_rodini
@predatel_rodini Год назад
Если работаешь с питоном на работе то конечно пайчарм выручает. Особенно прошка
@darksniper407
@darksniper407 Год назад
Так или иначе полезная инфа Помню о numpy с ML, но в таких скоростях нет необходимости)
@howl3440
@howl3440 Год назад
да кстати у питона есть API для С поэтому можно что-то написать на С а потом использовать в питоне благодаря чему некоторые библиотеки фреймворки написаны на C, C++ а какая у тебя тема в VS code? понравилась довольно приятная
@zproger
@zproger Год назад
Тема: Dracula. На счет Си это да, важные компоненты можно на нем писать, особенно тот код, который надо защитить.
@howl3440
@howl3440 Год назад
@@zproger благодарю
@stupiddudelive1893
@stupiddudelive1893 Год назад
есть некоторые подозрения, вот прям как-то на панель задач в видео смотрю, и вот прям шестое чувство подсказывает что это PyCharm. Не знаю почему у меня такое ощущение...
@glebgurzhiy1055
@glebgurzhiy1055 Год назад
Невероятно крутой видос
@user-fk2cq4ff4k
@user-fk2cq4ff4k Год назад
Видео крутое.!
@rokot
@rokot Год назад
Почитал новости, оказывается, началась работа над ускорением CPython. Версия 3.11 будет в разных случаях от 10% до 60% быстрее, чем 3.10. Что было сделано: 1) Faster Runtime. 2) Inlined Python function calls 3) Specializing Adaptive Interpreter Собираются в течение пару лет прикрутить JIT, что уже сделано на PyPy
@user-yi5vj9kn5s
@user-yi5vj9kn5s Год назад
Если посмотреть итоговое значение, которое выдаётся при использовании цикла с модулем Numpy, то оно отличается от того, что выдают первоначальные (имеются ввиду циклы в которых рассматривается именно арифметическая прогрессия), если понизить число итераций со 100000000 до 10000, то всё будет работать так как задумывалось автором изначально. Такие вещи нужно проверять на практике, а не слепо верить, что показанный вам материал в подобных видео, будет работать как часы.
@kozlovsg70
@kozlovsg70 Год назад
Точно, по умолчанию он считает элементы int32 поэтому у него будет происходить переполнение НО при этом никаких ошибок не выходит. Чтоб правильно считалось нужно записать так numpy.arange(100_000_000, dtype=numpy.int64) время при этом практически не меняется. Но это не единственная проблема, смотри мой самый свежий комментарий.
@mrd_a_r_kcode494
@mrd_a_r_kcode494 Год назад
Интересно видео 100% нигде его не видел:)
@a.osethkin55
@a.osethkin55 Год назад
Спасибо
@zproger
@zproger Год назад
😉
@mndtr0
@mndtr0 Год назад
2:15 Увы это совсем не образно : (. Отличный видос и информация полезная! А что у вас за дистрибутив стоит?
@MrPyps11
@MrPyps11 Год назад
Python написали что бы не писать на С, а давайте писать на С - Python медленный 😅
@predatel_rodini
@predatel_rodini Год назад
Блин. Вот это реально полезное видео. Хотя конечно если твой сервис начинает нуждаться в таком то походу твоя программа спроектирована как-то не правильно.
@zproger
@zproger Год назад
Ну бывают разные задачи, в некоторых моментах без такой либы на Си будет трудно
@Legantmar
@Legantmar Год назад
спасибо интересно. сравнил у себя Python 3 loop1 - 7.2 loop2 - 4.5 Python 2.7.18 loop1 - 5.5 loop2 - 9.8 loop2 - 8.2 (если вместо range использовать xrange) IronPython 2.7.3 loop1 - 4 loop2 - 9 (если вместо range использовать xrange)
@rokot
@rokot Год назад
Сравнил с PyPy, у меня первый цикл выполняется практически мгновенно loop1: 0.1593255. Ведь "PyPy is 4.5 times faster than CPython"
@MrVovak85
@MrVovak85 Год назад
Отличное видео👍 Жду Numpy
@zproger
@zproger Год назад
😉
@Sadownick
@Sadownick Год назад
Жаль, что можно поставить только один лайк 👍
@zproger
@zproger Год назад
Действительно жаль =) Спасибо
@ZA_CCCP
@ZA_CCCP Год назад
Привет. Можешь рассказать зачем нужен файл __init__.py ?
@m0Ray79
@m0Ray79 Год назад
Настоящая интеграция с C - это Pytex/Cython. Питоновский код транслируется в C и компилируется gcc, а синтаксическое надмножество Pyrex имеет плюшки вроде статической типизации, структур и указателей.
@sergo5918
@sergo5918 4 месяца назад
если в первом случае в def loop1() убрать (не нужный) result+=num то скорость сравняется со вторым вариантом, где используется range более того, если в def loop2() нагрузить первым бессмысленным действием (result+=num) то и скорость выполениея с range будет примерно такой же как и без range вывод : первые два примера имеют разницу в быстродействии аж 13% ( что имхо малосущественно ), остальные ещё не смотрел, но по общему мнению(что тоже требует проверки) numpy быстрее обычного питона на порядок, что уже существенно
@Alcoholdehydrogenas
@Alcoholdehydrogenas 11 месяцев назад
Я не силен в программировании, но вроде как функции loop1 и loop2 вернут разные значения. О каком сравнении идет речь? И какой линукс используется?
@kozlovsg70
@kozlovsg70 Год назад
Маленькое дополнение по NumPy после моих экспериментов с ним: 1. У автора вычисляется НЕ верная сумма, т.к. он использовал arange по умолчанию, а по умолчанию он считает элементы int32 поэтому у него будет происходить переполнение НО при этом никаких ошибок не выходит. Чтоб правильно считалось нужно записать так numpy.arange(100_000_000, dtype=numpy.int64) время при этом практически не меняется. 2. У всего есть цена и у arange она тоже есть, и это то что в отличии от range он СОЗДАЕТ ВЕСЬ массив в памяти, т.е. все эти 100 миллионов элементов! Когда я попытался создать больший массив на 10 миллиардов он вывел ошибку что памяти не хватает и нужно 74Гб оперативки!!! Кстати 70% времени работы уходит на создание этого массива, само суммирование за остальные 30%. Т.е если бы не создавался массив, можно было бы в 2 раза еще ускорить, но я не знаю возможно ли это в NumPy,. Это точно не numpy.sum т.к. он ждет на вход только массив.
@kozlovsg70
@kozlovsg70 Год назад
уточнение: numpy.sum берёт объект range() и память при этом не захватывает, но и работает примерно тоже время что цикл for, т.е. в 30 раз медленнее.
@kozlovsg70
@kozlovsg70 Год назад
NumPy в данном случае не подходит, а вот использование numba даёт просто колоссальное ускорение. Тот же цикл ускорился так что не фиксируется таймером, пришлось поставить 4_000_000_000 и summa считать во float, только тогда время выполнения стало 0.3 секунды. Память вообще не расходуется.
@nazarmakarenko-games5855
@nazarmakarenko-games5855 Год назад
А какой у вас Linux? Крутой видос
@zproger
@zproger Год назад
Zorin OS
@nazarmakarenko-games5855
@nazarmakarenko-games5855 Год назад
@@zproger спасибо:)
@invisinotofficial
@invisinotofficial Год назад
Мало кто знает, но самый быстрый способ выполнить программу в питоне - это не использовать питон, а перейти на что-то более менее адекватное.
@zproger
@zproger Год назад
🤔
@AlexandrSpirit
@AlexandrSpirit 6 месяцев назад
Си конечно мощно. Но проще всё же на Rust ускорить пайтон. За два года коммерческой разработки бекенда, ни разу не потребовались мощные вычисления в коде. Всё до боли банально - достать из БД или положить/обновить в БД запись. Хотя. Если в главном сервисе делать агрегацию данных, т.е. полученные по шине данные из разных сервисов сложить в один json, то наверное можно и написать на Си/Раст. П.С. Была задача по расчету количества потомков у животного до 4 колена. Но это нереально делать в коде, т.к. 5млн записей в БД занимает много места. Получить запросом и обработать не выйдет. Тут опять же нужно на SQL делать. В общем, непонятно где может пригодиться.
@hawchik6921
@hawchik6921 Год назад
расскажи про cython и формат файлов .pyx
@Hahal85
@Hahal85 Год назад
Извините за тупой вопрос (не давно начал изучать Пайтон), но как поставить стрелочку, в место "->"
@eugenex8892
@eugenex8892 Год назад
Тыщу лайков, хмм... ну лан лайкану, мне понравился хинт что в питоше можно int записать как 100_000_000.. Я не очень знаю питон, но отлично знаю Си. По поводу numpi скажу, что стоило-бы проверить ещё ударную по потокам процессора... Сисадмины очень часто жалуются на эту либу что она глушит процак. Итерация с сложением в Си скорее не милисикунды, скорее всего это наносекунды. В конечном итоге это скорее всего 8 команд асемблера, что для процессора вообще раз плюнуть.
@zproger
@zproger Год назад
Благодарю, полезная информация
@user-rh4fe2ce1d
@user-rh4fe2ce1d Год назад
🔥
@zproger
@zproger Год назад
😉
@APfOHx5Q
@APfOHx5Q Год назад
В си (или си++) можно реализовать блок через ассемблер и будет ещё быстрей😀
@zproger
@zproger Год назад
это да)
@toktarov1984
@toktarov1984 Год назад
кроме numpy ещё numba увеличивает скорость :)
@zproger
@zproger Год назад
Это да, но для неё отдельное видео =)
@blowyourbra1n233
@blowyourbra1n233 Год назад
привет, подскажи пожалуйста, что это за стрелочки после функции? для чего они нужны и как их писать?
@andrewantoniuk525
@andrewantoniuk525 Год назад
Это называется тайп хинты (type hint). Они нужны чтобы подсказать програмисту и среде разработки какой тип данных возвращает данная функция. Чисто для удобства существует. Записывается: def my_function() -> :
@predatel_rodini
@predatel_rodini Год назад
@@andrewantoniuk525 используется не только для удобства. Также можно линтером проверить типы перед коммитом например. А fast api например по ним тебе автоматически генрит документацию сваггер. Но да, сами хинты на содержимое объектов никак не влияют к сожалению.
@andrewantoniuk525
@andrewantoniuk525 Год назад
@@predatel_rodini ну это уже немного дебри. Я объяснил поверхостно и просто
@aleksandrdemidov6058
@aleksandrdemidov6058 Год назад
Хочу ctype! ) и если можно написание библиотек на Си для питона?
@kutsokon
@kutsokon Год назад
Видео крутое и очень информативное! Только почему нельзя было вывести точное время выполнения в C, а не округлять?
@vlad3c
@vlad3c Год назад
он ничего не округлял, time_t имеет точность в секунду, поэтому никаких мс быть не может. Обычно для замеров времени выполнения программы в Linux ее запускают с помощью утилиты time, тогда точность совсем другая. Но тут проблема совсем не в точности замера, а в непонимании работы компилятора. Подробнее я написал тут в коментарии
@user-hk4bq8be1d
@user-hk4bq8be1d Год назад
Поигрался с циклами, действительно Пи очень медленный, и на нем еще написано большинство современного софта ( ( .. Придется С вспоминать) Спасибо за gcc
@dazzle529
@dazzle529 Год назад
Попробовал с Go (просто цикл, без какой либо оптимизации) 100 000 000 - 42 ms 1 000 000 000 - 318 ms
@rokot
@rokot Год назад
В PyPy первый луп ещё быстрее 15 ms
@user-ni9oh7en4d
@user-ni9oh7en4d Год назад
Какой плагин используется для такой темы?
@zproger
@zproger Год назад
Material UI
@rpstudio-9455
@rpstudio-9455 Год назад
Привет, как обновить питон в Zorin OS 16?
@serafimgrubas2070
@serafimgrubas2070 Год назад
Замеры скорости работы функции в С вызывает большие сомнения, неужели она выполняется ровно 1 сек или 2 сек с точностю до 6 знака? Там ведь что-то точно округляется, и невозможно сравнить скорость с суммой из Numpy. А в целом, я думаю было бы круто ещё сравнить с Just-In-Time compilation из библиотеки Numba.
@01in93
@01in93 Год назад
Да, в C можно сделать так: #include #include clock_t begin, end; double elapsed; begin = clock(); /* Код, время выполнения которого мы хотим замерить */ end = clock(); elapsed = (double)(end - begin) / CLOCKS_PER_SEC; printf("Elapsed %lf sec ", elapsed);
@rexby
@rexby Год назад
Чтобы посмотреть время работы программы, можно запускать так: time ./main. И тогда не нужно это реализовывать в коде.
@zproger
@zproger Год назад
Ну да, но там насколько я знаю не выводится время каждой функции, хотя возможно и ошибаюсь, так как давно не делал подобное
@rexby
@rexby Год назад
@@zproger Да, выводит время работы программы. Но если программа состоит из одной функции, то получится то, что надо.
@dsShadega
@dsShadega Год назад
Измерения через функцию time() в С или C++ некорректны, т.к. точность этого метода только лишь до секунды. Нужно использовать более точные функции, а не time(). Т.к. у Вас какая-то linux образная ОС, то можно было бы использовать clock_gettime(). Ну либо стандартную clock() уже... А то, что у Вас получалось либо 0 либо 1 секунда, то это лишь потому, что момент запуска совпадал с переходом с предыдущей секунды на следующую...
@johannesgarin6559
@johannesgarin6559 9 месяцев назад
А теперь давайте представим, что есть такая библиотека, как numba и попробуем воспользоваться её функцией njit, в роли декоратора. import timeit import numpy as np from numba import njit value = 100_000_000 def loop1(num=0, result=0) -> int: while num < value: result += num num += 1 return result def loop2(result=0) -> int: for num in range(value): result += num return result def loop3() -> int: return sum((num for num in range(value))) def loop4() -> int: return sum([num for num in range(value)]) def loop5() -> int: return sum(range(value)) def loop6() -> int: return np.sum(np.arange(value)) @njit def loop7(num=0, result=0) -> int: while num < value: result += num num += 1 return result @njit def loop8(result=0) -> int: for num in range(value): result += num return result print(f"loop1: {timeit.timeit(loop1, number=1)}") print(f"loop2: {timeit.timeit(loop2, number=1)}") print(f"loop3: {timeit.timeit(loop3, number=1)}") print(f"loop4: {timeit.timeit(loop4, number=1)}") print(f"loop5: {timeit.timeit(loop5, number=1)}") print(f"loop6: {timeit.timeit(loop6, number=1)}") print(f"loop7: {timeit.timeit(loop7, number=1)}") print(f"loop8: {timeit.timeit(loop8, number=1)}")
@joehart7382
@joehart7382 Год назад
теперь понятно как комбинировать 2 языка)
@zproger
@zproger Год назад
Это да =)
@MDFireX5
@MDFireX5 6 месяцев назад
Дядь сделай пример со строками, например когда ты их парсишь и формируешь обьект, а не вот эта математика, которую питонисты увидят раз в жизни (в универе) а не на работе
@mammadalimammadaliyev6105
@mammadalimammadaliyev6105 Год назад
Где-то я видел это видео)
@zproger
@zproger Год назад
😉
@darksniper407
@darksniper407 Год назад
Интересно Вообще все делаю с лист компрехеншен, генератор, не залупит ничего в память. Поиск по файлу займёт время, но не так долго) Зависит от количества данных. Лист комп конечно не прямо миг, но я и не МЛ специалист тоже)
@degree777
@degree777 Год назад
Не люблю писать коментарии, но твои видео просто восхитительны, знай что ты это делаешь очень круто и без воды, годный видос )
@zproger
@zproger Год назад
Благодарю!
@gilman2056
@gilman2056 Год назад
Все очень интересно, но ничего не ясно. Так по видео же сравнивается арифмитические операции суммировани, а не сами циклы как таковые. Допустим какая польза мне от sum() если мне нужно перебрать словарь? А вот видос как прикрутить C к python для ускорения будет полезно
@user-yo8pq8mu6k
@user-yo8pq8mu6k 9 месяцев назад
сто пудовый лай и коммент
@valarg5756
@valarg5756 Год назад
Ждём новое видео
@zproger
@zproger Год назад
😉
@Salomon_li
@Salomon_li Год назад
Го видос про numpy!!!!
@Alpha_Gamma_Beta
@Alpha_Gamma_Beta Год назад
а на ассемблере будет быстрее?
@zproger
@zproger Год назад
Да
@omcs8996
@omcs8996 Год назад
А, чтобы Пито работал быстрее нам нужно использовать С… ок
@nichtverstehen2045
@nichtverstehen2045 Год назад
классика: "моя функсция нихрена не делает но выполняется очень быстро". смысла в подобных "оптимизациях" никакого, так как реальный код делает "чуть" больше, чем суммирует последовательност целых, которую можно вообще вычислить один раз и возвращать константу.
@zproger
@zproger Год назад
🤔
@user-ry5oh3qt2u
@user-ry5oh3qt2u Год назад
Самый лучший способ оптимизировать pyton программу-написать ее на С++
@zproger
@zproger Год назад
🤔
@fedor_ado
@fedor_ado Год назад
Видео о ctypes нужно.
@zproger
@zproger Год назад
Ок, сделаю =)
@0xsadcat92
@0xsadcat92 Год назад
Спасибо автору, всегда ненавидел питон, любил С++, теперь понял что ошибался, видно грамотного человека
@user-lp1ir6qr2w
@user-lp1ir6qr2w Год назад
Нет ничего плохого использовать сразу 2 этих языка, я активно использую плюсы в тандеме с пайтоном. На пайтоне пишу простую логику где не нужны какие-то сложные вычисления, а на плюсах наоборот пишу всю сложную логику где важна скорость вычисления
@SoundScape_Hub
@SoundScape_Hub Год назад
Хз якщо щось довго працює то паралельте процеси або векторизацію використовуйте як у відео якщо довго то проще динамічну компіляцю використовувати там не потрібно знати сі просто одна комада і все якщо ще заморочитися то можна статичну компіляцію зробити тоді сі потрібно знати а так кобінуйте методи стадартно пишете функцію яка рахує щось через векторизацію яка розпаралелена на 4 потока і якщо часто визиваєця компілюєця якщо рекурсії багато то декоратори ставите ще
@user-uo6rq1bl5g
@user-uo6rq1bl5g Год назад
А возможно ли запустить файл питон из другого файла на питоне У меня есть проект игры в которой файлы отделены Код меню отдельно Сама игра отдельно Типо сделать чтобы можно было из меню запустить саму игру по нажатию кнопки P.S Или ООП
@pr1t349
@pr1t349 Год назад
import + название файла
@elkins87
@elkins87 Год назад
Для чего стрелочки "-> int"в функции loop? Без них функция будет работать по-другому?
@hilline6394
@hilline6394 Год назад
Аннотация, указывающая на тип данных который должна возвращать функция. Нужна в основном просто для того, чтобы лучше ориентироваться в коде. Работа функции от этого не меняется
@loafius
@loafius Год назад
по-моему, он просто явно задал тип возвращаемого значения. Функция так же работает.
@guiterenzog2723
@guiterenzog2723 Год назад
Это аннотация типа для линтеров. Она никак не влияет на компилятор, он просто проигнорирует эту часть строки. Зато, если подключены линтеры, они смогу выдать предупреждение о несоответствии типа возвращаемого значения с ожидаемым.
@bairshirapov3449
@bairshirapov3449 8 месяцев назад
Программы не совсем идентичные. В программе на С оптимизатор видит что result никак не используется никуда не передаётся и просто не запускает цикл, вообще все что связано с result в скомпилированный код не попадает, поэтому программа выполняется действительно мгновенно.
@user-px8rk8cf7n
@user-px8rk8cf7n Год назад
Питон серьезный язык или нет ?
@zproger
@zproger Год назад
Кому как
@RuslanKovtun
@RuslanKovtun Год назад
7:16 - а если компилировать с флагом оптимизации `-O3` весь цикл сворачивается в формулу. Цикл на 1е15 итераций отрабатывает за 3мс (время запуска, выполнения и завершения программы с выводом результата в консоль). Куда интересней просуммировать последовательность, как в python `sum(range(10**8))`, т.е. `sum += num` а не `sum++`.
@user-vb9qg4vl1k
@user-vb9qg4vl1k Год назад
Такое `-O3` тоже свернет в num * (value * (value + 1)) >> 1. Автор, изучи, пожалуйста, опции оптимизации gcc прежде чем бенчмаркать! Используемый метод time имеет точность в секунду, вы не могли не заметить этого, так что замеры там практически бесполезны, можно использовать clock(), в C++ есть вариант получше -- std::chrono
@user-em7zt1kr3u
@user-em7zt1kr3u Год назад
Сделай плиз ролик по использованию модуля ctypes. Максимально подробно, плиз!
@zproger
@zproger Год назад
Хорошо =)
@MakarenkoSasha
@MakarenkoSasha Год назад
может тогда в с++ кое-что писать на python
@zproger
@zproger Год назад
Можно и так :D
@muzaffaryusupov6435
@muzaffaryusupov6435 Год назад
Ой, а я на Си пишу😇
@zproger
@zproger Год назад
=)
@user-eo9td2bj5q
@user-eo9td2bj5q Год назад
да ужж сравнили 2ное вычисление с одинарным), и подход нелогичный немног, тогда уж не си , а голанд дучше бы импортировали, теперь уже даж для игрушек берут многопроцессорные сокеты и процы по 20 ядер с куевым количеством потоков и язык си уже стал подтупливать, а питон в принцыпе не для быстрых задач, а для всех кроме десктопа почти)
@vano03voin
@vano03voin Год назад
Хочу гайд по num py
@geri_freki
@geri_freki Год назад
import numpy as np
@zproger
@zproger Год назад
=)
Далее