Действительно ли выполнимо скомпилировать Python в машинный код?

Я бы использовал метод Array.sort. http://jsfiddle.net/LJWrg/

var divArr = $("div[id*=pi_div]");
function cleanId(id) {
    return parseInt(id.replace("pi_div",""),10);
}
Array.prototype.sort.call(divArr,function(a,b) {
    return cleanId(a.id) > cleanId(b.id);
});
divArr.each(function(){
    console.log(this.id);
});

jQuery действительно использует этот метод, определяемый внутри, поэтому вы можете сократить его до этого (однако он использует недокументированные методы) http://jsfiddle.net/LJWrg/1/ :

var divArr = $("div[id*=pi_div]");
function cleanId(id) {
    return parseInt(id.replace("pi_div",""),10);
}
divArr.sort(function(a,b) {
    return cleanId(a.id) > cleanId(b.id);
});
divArr.each(function(){
    console.log(this.id);
});

123
задан Andy Balaam 13 August 2009 в 14:45
поделиться

8 ответов

Попробуйте компилятор ShedSkin Python к C++, но это совсем не прекрасно. Также существует Psyco - Python JIT, если только ускорение необходимо. Но по моему скромному мнению это не стоит усилия. Поскольку критические по отношению к скорости части лучшего решения кода должны были бы записать им как расширения C/C++.

29
ответ дан 24 November 2019 в 01:18
поделиться

Ответ "да, Это возможно". Вы могли взять код Python и попытку скомпилировать его в эквивалентный код C с помощью API CPython. На самом деле раньше был проект Python2C, который сделал просто, что, но я не услышал об этом за многие годы (назад в дни Python 1.5, когда я в последний раз видел его.)

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

2
ответ дан 24 November 2019 в 01:18
поделиться

Psyco является своего рода своевременным (JIT) компилятором: динамический компилятор для Python, выполнения кодируют в 2-100 раз быстрее, но требуется много памяти.

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

2
ответ дан 24 November 2019 в 01:18
поделиться

Jython имеет компилятор, предназначающийся для байт-кода JVM. Байт-код является полностью динамичным, точно так же, как сам язык Python!Очень здорово. (Да, поскольку ответ Greg Hewgill ссылается, байт-код действительно использует время выполнения Jython, и таким образом, файл банки Jython должен быть распределен с Вашим приложением.)

3
ответ дан 24 November 2019 в 01:18
поделиться

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

10
ответ дан 24 November 2019 в 01:18
поделиться

PyPy является проектом повторно реализовать Python в Python, с помощью компиляции для собственного кода как одна из стратегий реализации (другие, являющиеся VM с JIT, с помощью JVM, и т.д.). Их скомпилированные версии C, выполненные медленнее, чем CPython в среднем, но намного быстрее для некоторых программ.

Shedskin является экспериментальным компилятором Python к C++.

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

14
ответ дан 24 November 2019 в 01:18
поделиться

Это могло бы казаться разумным на первый взгляд, однако существует много обычных вещей в Python, которые не являются непосредственно отображаемыми к к представлению C, не перенося большую поддержку во время выполнения Python. Например, утиный ввод приходит на ум. Много функций в Python, которые читают вход, могут взять файл или подобный файлу объект, пока он поддерживает определенные операции, например, читайте () или readline (). Если бы Вы думаете о том, что это взяло бы для отображения этого типа поддержки C, Вы начинаете воображать точно виды вещей, которые уже делает система времени выполнения Python.

существуют утилиты такой как py2exe, который свяжет программу Python и время выполнения в единственный исполняемый файл (в максимально возможной степени).

9
ответ дан 24 November 2019 в 01:18
поделиться

Как @Greg Hewgill говорит это, существуют серьезные основания, почему это не всегда возможно. Однако определенные виды кода (как очень алгоритмический код) могут быть превращены в "реальный" машинный код.

существует несколько опций:

  • Использование Psyco, который испускает машинный код динамично. Необходимо выбрать тщательно который методы/функции преобразовать, все же.
  • Использование Cython, который является Python - как язык, который компилируется в расширение Python C
  • Использование PyPy, который имеет переводчика от RPython ( ограниченное подмножество из Python, который не поддерживает некоторые самые "динамические" функции Python) к C или LLVM.
    • PyPy все еще очень экспериментален
    • не, все расширения будут существующие

После этого, можно использовать один из существующих пакетов (замораживание, Py2exe, PyInstaller) для помещения всего в один двоичный файл.

, В целом: нет никакого общего ответа для Вашего вопроса. Если у Вас есть код Python, который является критическим по отношению к производительности, попытайтесь использовать как можно больше встроенной функциональности (или спросить, "Как я заставляю свой Python кодировать быстрее" вопрос). Если это не помогает, попытайтесь определить код и портировать его на C (или Cython) и использовать расширение.

53
ответ дан 24 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: