PyPy-как он может победить CPython?


Из блога Google с открытым исходным кодом :

Он является реинкарнацией питона в Python, используя передовые методы чтобы попытаться достичь лучшей производительности чем CPython. Много лет упорного труда наконец-то расплатились. Наша скорость результаты часто бьют CPython, начиная от того, чтобы быть немного медленнее, к ускорение до 2х в реальном времени код приложения, для ускорения до 10х на малых критериев.

Как это возможно? Реализация на Python был ли использован для реализации PyPy? CPython ? И каковы шансы Пипипы или Пипипы побить их счет?

(на соответствующей ноте... зачем кому-то пытаться сделать что-то подобное?)

4 239

4 ответа:

Q1. Как такое возможно?

Ручное управление памятью (что и делает CPython со своим подсчетом) в некоторых случаях может быть медленнее автоматического управления.

Ограничения в реализации интерпретатора CPython исключают некоторые оптимизации, которые может выполнить PyPy (например. мелкозернистые пряди).

Как упоминал Марсело, Джит. Возможность на лету подтвердить тип объекта может избавить вас от необходимости делать несколько разыменований указателей, чтобы, наконец, приходите к методу, который вы хотите вызвать.

Q2. Какая реализация Python использовалась для реализации PyPy?

Интерпретатор PyPy реализован в RPython, который является статически типизированным подмножеством Python (язык, а не интерпретатор CPython). - См. https://pypy.readthedocs.org/en/latest/architecture.html Подробнее.

Q3. И каковы шансы Пипипы или Пипипы побить их счет?

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

Обновление: недавно, натщательно обработанном примере , PyPy превзошел аналогичную программу C, скомпилированную с gcc -O3. Это надуманный случай, но он демонстрирует некоторые идеи.

Q4. С чего бы это кто-нибудь пробовал что-то подобное?

С официального сайта. https://pypy.readthedocs.org/en/latest/architecture.html#mission-statement

Мы стремимся обеспечить:

  • Общая система перевода и поддержки для производства
    реализации динамических языков, подчеркивая чистый
    разделение между спецификацией языка и реализацией
    аспекты. Мы называем это RPython toolchain_.

  • А уступчивый, гибкая и быстрая реализация Python_ Язык, который использует вышеупомянутую цепочку инструментов для включения новых продвинутых высокоуровневые функции без необходимости кодирования низкоуровневых подробности.

Разделяя таким образом проблемы, наша реализация Python-и другие динамические языки-способен автоматически генерировать Just-in-Time компилятор для любого динамического языка. Он также позволяет комбинированный подход к принятию решений по внедрению, включая многие тот исторически были вне контроля пользователя, такие как целевая платформа, модели памяти и потоков, сборка мусора применяемые стратегии и оптимизации, включая вопрос о том, следует ли имейте Джит в первую очередь.

Компилятор C gcc реализован на языке C, компилятор Haskell GHC написан на языке Haskell. Есть ли у вас какие-либо причины для того, чтобы интерпретатор/компилятор Python не был написан на Python?

"PyPy-это реимплементация Python в Python" - это довольно ошибочный способ описания PyPy, IMHO, хотя технически это верно.

Существует две основные части PyPy.

  1. структура перевода
  2. переводчик

Фреймворк перевода является компилятором. Он компилируетRPython код вплоть до C (или других целевых объектов), автоматически добавляя такие аспекты, как сборка мусора и JIT-компилятор. Он не может обрабатывать произвольные Код Python, только RPython.

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

Интерпретатор тогда является обычным интерпретатором Python, написанным на языке RPython.

Поскольку код RPython является обычным кодом Python, вы можете запустить его на любом интерпретаторе Python. Но ни одно из утверждений PyPy о скорости не происходит от запуска его таким образом; это только для быстрого цикла тестирования, потому что перевод интерпретатора занимает долгое время.

При таком понимании должно быть сразу очевидно, что рассуждения о PyPyPy или Pypypy на самом деле не имеют никакого смысла. У вас есть переводчик, написанный на языке 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 быстрее (возможно).

PyPy реализован в Python, но он реализует JIT-компилятор для генерации собственного кода на лету.

Причина реализации PyPy поверх Python, вероятно, заключается в том, что это просто очень продуктивный язык, тем более что JIT-компилятор делает производительность хост-языка несколько несущественной.

PyPy написан на ограниченном языке Python. Насколько мне известно, он не работает поверх интерпретатора CPython. Ограниченный Python-это подмножество языка Python. AFAIK, интерпретатор PyPy компилируется в машинный код, поэтому при установке он не использует интерпретатор python во время выполнения.

Ваш вопрос, похоже, предполагает, что интерпретатор PyPy работает поверх CPython во время выполнения кода. редактировать: Да, он сначала переводить в PyPy Python-кода, либо с и строить с помощью gcc, байт-кода jvm или кода .NET CLI. Смотрите Начало Работы