«PyPy - это повторная реализация Python в Python» - это довольно обманчивый способ описать PyPy, ИМХО, хотя это технически верно.
Есть две основные части PyPy.
- Структура перевода
- Переводчик
Структура перевода - это компилятор. Он компилирует код RPython до C (или других целей), автоматически добавляя такие аспекты, как сборка мусора и JIT-компилятор. Он не может обрабатывать произвольный код Python, только RPython.
RPython - это подмножество нормального Python; Весь код RPython - это код Python, но не наоборот. Формального определения RPython не существует, потому что RPython - это просто «подмножество Python, которое можно перевести с помощью среды перевода PyPy». Но для перевода код RPython должен быть статически типизирован (типы выводятся, вы не объявляете их, но это по-прежнему строго один тип для каждой переменной), и вы не можете делать такие вещи, как объявление / изменение функций / занятия во время выполнения либо.
Таким образом, интерпретатор - это обычный интерпретатор Python, написанный на RPython.
Поскольку код RPython - это обычный код Python, вы можете запустить его на любом интерпретаторе Python. Но ни одно из заявлений PyPy о скорости не исходит из того, что он работает таким образом; это просто для быстрого цикла тестирования, потому что перевод переводчика занимает много времени.
С этим пониманием должно быть сразу очевидно, что спекуляции о PyPyPy или PyPyPyPy на самом деле не имеют никакого смысла. У вас есть переводчик, написанный на RPython. Вы переводите его в код C, который быстро выполняет Python. Там процесс останавливается; больше нет RPython, чтобы ускорить его обработку.
Так что «Как PyPy может быть быстрее, чем CPython» также становится довольно очевидным. PyPy имеет лучшую реализацию, включая JIT-компилятор (я думаю, что без JIT-компилятора, как правило, не так быстро, что означает, что PyPy быстрее только для программ, чувствительных к JIT-компиляции). CPython никогда не была разработана , чтобы быть в высшей степени оптимизации реализации языка Python (хотя они и пытаются сделать его высоко оптимизированную реализацию, если вы будете следовать разнице).
Действительно инновационный аспект проекта PyPy заключается в том, что они не пишут сложные схемы GC или JIT-компиляторы вручную. Они пишут интерпретатор относительно просто в RPython, и для всех RPython является более низким уровнем, чем Python, он все еще является объектно-ориентированным языком сборки мусора, гораздо более высоким уровнем, чем C. Затем инфраструктура перевода автоматически добавляет такие вещи, как GC и JIT. Таким образом, рамки перевода огромныусилия, но это в равной степени относится и к интерпретатору Python PyPy, однако они меняют свою реализацию, предоставляя гораздо большую свободу в экспериментах для повышения производительности (не беспокоясь о появлении ошибок GC или обновлении JIT-компилятора, чтобы справиться с изменениями). Это также означает, что когда они приступят к реализации интерпретатора Python3, он автоматически получит те же преимущества. И любые другие интерпретаторы, написанные с помощью платформы PyPy (которых на разных этапах полировки много). И все интерпретаторы, использующие платформу PyPy, автоматически поддерживают все платформы, поддерживаемые платформой.
Таким образом, истинное преимущество проекта PyPy состоит в том, чтобы отделить (насколько это возможно) все части реализации эффективного независимого от платформы интерпретатора для динамического языка. А затем придумайте одну хорошую реализацию их в одном месте, которую можно будет повторно использовать во многих переводчиках. Это не немедленная победа, как «моя Python-программа работает быстрее сейчас», но это большая перспектива на будущее.
И он может запустить вашу программу на Python быстрее (возможно).