Найти тему

Почему Python медленнее С в 4* раза и что нам с этим делать?

Оглавление

Вы запросто можете услышать такое где-то и подумать «Ну и зачем тогда нужен Python! Надо тогда C изучать, кто Python учит те дураки». И будете неправы.

Откуда такая разница в скорости?

Причин несколько, одна из основных состоит в том, что Python — интерпретируемый язык, а C — компилируемый (о других причинах читайте в статье-продолжении). Что это значит?

Если вы напишите программу на C (файл с кодом, имя которого заканчивается на ".c"), то запустить этот файл вы не сможете. Запустить можно исполняемый файл, в Windows название таких файлов заканчивается на «.exe». Это на иконку такого файла вы нажимаете, чтобы запустить приложение.

Так вот, запустить просто файл с кодом на C нельзя. Поэтому вы запустите программу, которая возьмёт этот файл с текстом кода и переведёт его на язык компьютера, обычно язык нулей и единиц. Она не просто переведёт, она создаст именно исполняемый (".exe") файл. Вот его уже можно будет запускать.

Такая программа называется компилятор. Как письменный переводчик, она берёт документ на одном языке (C) и создаёт новый документ(exe). После этого компилятор (как и письменный переводчик) больше не нужен. Один раз перевёл и всё. Программа работает без него.

Программа на языке Python (файл, заканчивающийся на .py) доносится до компьютера по-другому. Представьте устного переводчика. Если какой-нибудь иностранный деятель, который не знает русского языка должен выступить перед жителями Новосибирска, ему дадут такого переводчика. Деятель произносит фразу, переводчик слушает, переводит у себя в голове, и только потом произносит аудитории. Это работает гораздо медленнее — пока переводчик прослушает, пока переведёт, пока озвучит, пока те, кто слышат, поймут... Быстрее можно получить ту же информацию, если взять запись выступления или заранее написанный текст речи, перевести и записать в документ. Как компилятор берёт текст программы и записывает в файл «.exe».

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

Получается, если мы написали программу на C и скомпилировали — нам C и его компилятор больше не нужны. Файл ".exe" (или другой бинарный файл в других системах) можно переносить на любой другой компьютер с той же системой и запускать. Мы будем запускать только этот файл программы. Так же не нужен нам и переводчик после того, как мы получили перевод в виде документа.

Если мы написали программу на Python, то у нас не будет исполняемого файла. Каждый раз, кликая по файлу с кодом питона, заканчивающемуся на ".py", мы будем запускать программу-интерпретатор Python («устный переводчик»). И эта программа будет работать, и каждый раз заново переводить каждую строчку кода на Python на язык нулей и единиц. Без установленного интерпретатора программы на Python не будут запускаться.

Поэтому программа, написанная на самой популярной версии Python — CPython, работает раза в 4 медленнее, чем такая же программа, написанная на C. Ведь каждый раз снова и снова прямо во время выполнения работы перечитывает и перечитывает, что нужно делать.

Значит, C лучше и надо учить его?

-2

Да нет, почему же. Компилируемые и интерпретируемые языки просто имеют разные ниши. Да, интерпретируемый язык даёт медленную скорость работы, но современные компьютеры мощные и быстрые, в большинстве случаев разница некритична и человеку незаметна, для него что так что так всё будет работать мгновенно.

Зато интерпретируемые языки удобны в другом. Вот есть у нас очень большая программа, написанная на компилируемом языке. Решили что-то в ней поменять — чтобы запустить изменённую версию, нужно подождать, пока из твоего кода компилятор создаст сам файл программы. Если программа большая, то ждать придётся долго. А если на интерпретируемом языке? Сохранили просто файл кода и всё, интерпретатор, когда надо будет это место прочитать, прочитает уже новую версию кода.

Давайте вернёмся к примеру с переводчиками. Да, письменный перевод быстрее. И устные переводчики часто заранее получают текст речи и переводят его, по ходу речи просто следят. Но если докладчик решит отойти от запланированной речи и сказать что-то другое — устный переводчик перестроится на лету и переведёт уже актуальный материал. Письменного перевода новой версии речи, актуальной, ждать, наоборот, придётся дольше, чем от устного переводчика.

Весь интернет — сайты, сервера активно используют JS, PHP, Python. Это языки интерпретируемые. Как раз потому, что если что-то работает не так, можно очень быстро исправить ошибку или отменить изменения в отдельном файле. И интерпретатор тут же начнёт отправлять компьютеру обновлённые инструкции.

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

И многим лучше всё же в начале изучать Python — потому что им в начале очень тяжело изучать программирование. Почему — написал в этой статье.

И ещё момент! Если всё же нужна скорость, то есть специальные версии Python, которые работают гораздо быстрее. Например, PyPy — скорость почти как у C! Но об этом в другой раз.

Резюмируем

Есть интерпретируемые языки программирования, например, Python, есть компилируемые языки программирования, например, C. Программа на интерпретируемом языке работает медленнее, часто в несколько раз. Но скорость — это лишь один из множества параметров, плюсов или минусов языка программирования, есть и другие. Часто скорость не важна. И то, какой язык учить, зависит прежде всего не от скорости — а от целей, того, зачем вы собираетесь изучать программирование.

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

Статья-продолжение.

-----------------------------

* Да, на деле 4 — это усреднённые и не самые точные данные, где-то на 30% медленнее, где-то в 24. Эту усреднённое число я взял у Тимофея Хирьянова на его лекции.