Как я понимаю, причина разницы в скорости между скомпилированными языками и python заключается в том, что первый компилирует код вплоть до кода нативной машины, тогда как python компилирует в байт-код python для интерпретации PVM. Я вижу, что таким образом коды Python могут использоваться в нескольких операционных системах (по крайней мере, в большинстве случаев), однако я не понимаю, почему нет дополнительного (и необязательного) компилятора для Python, который компилируется так же, как и традиционные компиляторы , Это оставит программисту выбирать, что для них важнее; многоплатформенная исполняемость или производительность на родной машине. В целом; почему нет языков, которые можно было бы вести как скомпилированными, так и интерпретированными?
источник
Ответы:
Нет. Причина, по которой существуют различия в скорости между такими языками, как Python и C ++, заключается в том, что статически типизированные языки дают компилятору тонны информации о структуре программы и ее данных, что позволяет оптимизировать как вычисления, так и доступ к памяти. Поскольку C ++ знает, что переменная имеет тип int, она может определить оптимальный способ манипулирования этой переменной даже до запуска программы. В Python, с другой стороны, среда выполнения не знает, какое значение находится в переменной, пока интерпретатор не достигнет строки. Это чрезвычайно важно для структур, где в C ++ компилятор может легко определить размер структуры и каждое расположение ее полей в памяти во время компиляции. Это дает ему огромные возможности в прогнозировании использования данных и позволяет оптимизировать их в соответствии с этими прогнозами.
Для эффективной компиляции таких языков, как Python, вам необходимо:
источник
eval
и кучу других вещей, которые расстраивают авторов компиляторов. Это не до уровня gcc, но, безусловно, быстрее, чем интерпретатор CPython.Две концепции могут помочь нам лучше понять, почему Python, скомпилированный с собственным машинным кодом, «может» работать не так быстро, как скомпилированный C или другие обычно скомпилированные языки. Их называют ранним связыванием и поздним связыванием.
Я должен начать с того, что я не эксперт по Python, и я попал на этот сайт случайно. Но мне нравится этот сайт.
Как уже упоминалось в другом ответе, компилятор C ++ может много знать о программе и принимать решения о том, какие операции использовать для конкретных структур данных. Например, если две целочисленные переменные необходимо сложить вместе, компилятор знает, что они являются родными целыми числами, например, 32-битной шириной, и он может добавить их вместе с помощью одной инструкции "ADD". Таким образом, он компилирует инструкцию ADD в код. Он заблокирован и не может быть изменен во время работы программы. Это раннее связывание.
С другой стороны, в таком языке, как Python, можно ожидать, что программа сложным образом объединит разные типы данных. Теперь компилятор не знает, являются ли наши 2 переменные целыми числами, числами с плавающей запятой, строками или списками. Поэтому он должен скомпилировать код, который определяет эту информацию во время выполнения и выбрать правильную операцию во время работы программы. Это поздняя привязка, и мы можем понять, что производительность этой дополнительной работы во время работы программы будет снижена. Это цена, которую вы платите за то, что эти опции открыты на таком языке, как Python, но это обеспечивает максимальную гибкость во время выполнения.
источник
Я думаю, что это больше связано с самой спецификой Python, по той же причине, по которой вы не можете скомпилировать C # в машинный код. Специфика языка на самом деле делает ваши программы глючными, даже если это возможно из-за характера языка. Почему бы просто не выучить язык Си? Это намного проще, чем C ++, и немного продвинуто, чем Python, но все же доступно.
источник