2015-07-05 2 views
3

Я знаю, что Python в основном медленнее, чем языки, такие как fortran и c/C++, потому что они интерпретируются, а не компилируются.Может ли Python быть статически напечатан?

Другая причина, по которой я также читал, это то, что она довольно медленная, потому что она динамически типизирована, т. Е. Вам не нужно объявлять типы переменных, и она делает это автоматически. Это очень приятно, потому что он делает код более чистым, и вам в основном не нужно слишком беспокоиться о типах переменных.

Я знаю, что для этого не будет очень веской причины, так как вы можете просто обернуть, например. fortran с Python, но можно ли вручную переопределить этот динамически типизированный характер Python и объявить все типы переменных вручную и тем самым увеличить скорость Python?

+2

Почему скорость важнее для вас, чем читаемость в этом случае? Читаемый код может быть легко * сделан * быстрее, но может быть очень сложно сделать быстрый код более удобочитаемым. –

+5

Вы можете использовать Cython, используя слегка измененный синтаксис Python, который компилируется на C. Но в противном случае создание статического ввода Python в основном сделало бы его совсем другим языком. Если вам нужна такая скорость, просто используйте статически типизированный язык. –

+0

Если вы прочтете весь вопрос, вы увидите, что это скорее гипотетический подход к природе Python, чем с вычислительной скоростью @RedRoboHood – Jonny

ответ

1

Если я интерпретирую ваш вопрос как «Есть ли статически типизированный режим для Python?», то Cython, вероятно, ближе всего предлагает эту функциональность.

Cython - это надмножество синтаксиса Python - почти любой действительный код Python также является действительным кодом Cython. Компилятор Cython преобразует исходный код квази-Python в негласные глаза C, который затем может быть скомпилирован в общий объект и загружен как модуль Python.

Вы можете в основном взять свой код на Python и добавить столько или несколько объявлений статического типа, сколько захотите. Где бы не были объявлены типы, Cython добавит в необходимый шаблон, чтобы правильно их вывести за счет снижения производительности во время выполнения. Это, по сути, позволяет вам выбрать точку в континууме между полностью динамически типизированным кодом Python и полностью статически типизированным C-кодом, в зависимости от того, сколько времени выполнения требуется вам и сколько времени вы готовы провести оптимизацию. Он также позволяет вам напрямую вызывать функции C, что делает его очень удобным способом записи привязок Python для внешних библиотек.

Чтобы лучше понять, как это работает на практике, взгляните на official tutorial.

+0

Спасибо @ali_m. Как pypy (что упоминается в нескольких комментариях выше) по сравнению с Cython? Составляет ли JIT-компилятор на C, как в Cython? – Jonny

+1

Я не знаю, я знаю точную информацию о реализации JIT-компилятора PyPy, но я уверен, что он компилируется непосредственно на собственный машинный код без какого-либо промежуточного кода кода C. Главный недостаток PyPy - совместимость - поддержка основных чисел библиотеки, такие как numpy, scipy и т. д., являются неоднородными до несуществующих, что перевешивает его преимущества для большинства людей, которые действительно заботятся о производительности. См. Здесь для дальнейшего обсуждения: http://stackoverflow.com/q/18946662/1461210. –

3

Просто для того, чтобы быть понятным, ваш вопрос примерно такой же странный, как и запрос, можете ли вы включить C в динамически типизированный язык. Если вы хотите переопределить язык, то обязательно, вы можете делать все, что захотите. Я не думаю, что мы будем называть такой язык «Python», хотя.

Если вы ищете ускорение на основе динамической статической типизации (статическая типизация, которая динамически найдена), то реализация языка взгляните на pypy. Это также довольно быстро, если это то, что вы ищете. Связанный с pypy - RPython, который делает то, что вы хотите.

Также упоминается ранее Cython, который делает то, что вы хотите.

+1

* Я не думаю, что мы будем называть такой язык «Python», хотя. * Точно. Зачем переводить язык в непреднамеренную цель, когда вы можете просто использовать другой язык с другой целью? –

+1

Я не говорил «Давайте сделаем новый язык». Я просто задал вопрос, который, на мой взгляд, не является однозначным или основанным на мнениях. Einther вы можете запускать Python статически, или вы не можете. Да или нет, вопрос (-: Спасибо за ответ @CrazyCasta. Я ничего не узнаю от него. – Jonny

+0

О, просто чтобы быть техничным, грамматика вашего вопроса подскажет, что вы спрашивали об изменении python. Похоже, что вы «Запрашивается ли« python имеет статически типизированный режим »или« Существуют ли способы статической типизации в python ». – CrazyCasta

Смежные вопросы