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

preview_player
Показать описание

В данном видео мы узнаем какой цикл в Python самый быстрый.
Рассмотрим что быстрее: for или while?
Найдем причину и также ускорим циклы по максимуму используя технологии из видео.

Рекомендации по теме
Комментарии
Автор

Хочешь ускорить python, пиши на С, как то так я понял это видео)

drimmwald
Автор

Видео по ctypes будет круто увидеть! Годный контент, давно была идея объединить с и Пайтон, но казалось сложной затеей, спасибо!

artemnemcov
Автор

Разница все же небольшая есть в начальных циклах while и for:
- в цикле while выполняется увеличение значения переменной "result" на 1
- в цикле for выполняется увеличение значения переменной "result" на значение переменной "num"

Другими словами, функции loop1() и loop2() вернут разные значения.

dijxorf
Автор

Quick review: самый быстрый способ итерировать в пайтон — не итерировать в пайтон.
Ты использовал разные функции: где-то ты считал сумму чисел до ста миллионов, а где-то количество чисел до ста миллионов. Вещи разные, и потому как интерпритатор пайтон, так и компилятор gcc будут по разному оптимизировать код. С большой долей вероятности, gcc съел весь твой цикл, так как увидел константные литералы и цикл по ним, и выдал предкомпилированный ответ.

munzamt
Автор

Не хватает действительно самого быстрого варианта - суммы арифметической прогрессии )

MihailOnuchin
Автор

Щас бы в первом цыкле увеличивать на 1 а во втором на арефметичческую прогресию ... автор гений

Fleshvinn
Автор

Попробуйте return (i * (i - 1)) // 2

Numpy - очень крутая библиотека. Лежит в основе кучи фреймворков для дата-аналитики и ML. Вот только аллоцирует соответственно бооооольшой блок в памяти. А для быстрых вычислений, кстати, можно ещё Numba или что-то другое с JIT-компиляцией использовать. А если ещё и с распределенными вычислентями на видеокарте... Мммм пушка-гонка))

bwinyos
Автор

Забавное видео, я не знаком с питоном совсем, чего не скажу про си. Так вот разница в них в том, что питон это интерпретируемый язык, а си - компилируемый. И скорость выполнения циклов такая потому что в си есть компилятор и такие циклы он оптимизирует на раз, даже без флага -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. Хотя могу ошибаться тут, т.к. питон не изучал...

vladc
Автор

Если расскажешь о методах ускорения питона с помощью си это будет огонь!
Не знал, что можно писать свои модули на си, теперь появилось много разных мыслей/идей
Спасибо!)

ykzcvyu
Автор

def loop1(num = value):
result = 0
while num:
result += num
num -=1
return result
print(t())
на 28% быстрее вашего whil'a считает

NirrBell
Автор

5:50 если совсем коротко, в Си for появился просто для упрощения работы программистов (синтаксический сахар), на деле же грубо говоря это просто обёртка цикла while.
Ну, не с помощью LOOP циклы реализовываем, и на том спасибо)

lpirqrw
Автор

В цикле while Вы не вычисляете sum(range(value), Вы только увеличиваете rezult+=1, а в цикле for Вы
действительно вычисляете sum(range(value). Сравнение не совсем корректно.

kvohexf
Автор

Как сказал ещё mCoding:
Самый быстрый способ писать циклы в питоне - не писать циклы в питоне
Если вам нужна скорость в питоне - не используйте питон

vlatterran
Автор

Очень нужно видео о том, как передавать/забирать из си переменные в питон

stepan
Автор

Цикл фор в си сделай по другому:
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раза минимум

Насчёт ситайпс - сделай.
Развлекайся)))

lllbenderlll
Автор

Та ты гений! Превью видео даже не преувеличено, а так как есть, лови респект

artembagachkov
Автор

Неоднозначное видео. Автор, естественно, не врёт, особенно если понять, что во второй функции просто небольшая опечатка. Там нужно убрать у result += num знак плюса, вы получите похожие значения. Т.е. название видео полностью оправданно, при работе с пайтоном нужно помнить, где можно сэкономить время.
Но с другой стороны важно понимать принципиальную разницу двух циклов. В данной ситуации вы просто пытаетесь использовать цикл while взамен цикла for. Однако они имеют разное значение в программировании. While изначально не подразумевает работу с такими большими значениями, и он работает непосредственно с true и false, т.е. входные параметры можно сделать любые, сравнивать хоть текст, хоть логическое, хоть цифру. А цикл с параметром изначально задуман как счётчик. Можно ли заменять эти циклы друг другом? Да. Но зачем? В теории можно ходить на руках и брать ногами вилку. Но есть ли в этом смысл? Не думаю.

usdeykc
Автор

Написал комент на средине, но когда досмотрел до конца это просто огненно 🔥 Продолжай 👊🤝

master
Автор

На С неважно for или while, все примерно одинаково работают по скорости выполнения. Но чтобы на С корректно замерить время выполнения цикла, надо итоговую сумму в конце вывести на экран, тогда компилятор сделает честный код. При этом важно поставить опцию компиляции -O2 (можно и -O3). Однако, если у Вас простейший инкремент, то умный компилятор может свернуть его самостоятельно вне зависимости от вывода результата на печать :) Возможно, лучше тестировать сумму арифметической прогрессии, чтобы компилятор не смог распознать зависимость. На С/С++ легко наступить на грабли и требуется некоторое время на составление корректного теста.

Anatolii_V_Novikov
Автор

Реально крутые видосы
Смотрю с удовольствием

domochevsky