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



с Google Open Source Blog:




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




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



(Примечание... зачем кому-то пытаться сделать что-то подобное?)

661   4  

4 ответов:

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

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

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

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

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

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

Q3. И каковы шансы на то, что pypypy или pypypypy избиение их счет?

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

обновление: недавно, на тщательно проработанный пример, он опережает аналогичные программы на языке 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-это написано на языке Хаскелл. У вас есть какие-либо причины, по которым интерпретатор/компилятор Python не должен быть написан на Python?

"Он является реинкарнацией Python С на Python" является вводящим в заблуждение способом описания данных, ИМХО, хотя это технически верно.

есть две основные части PyPy.

  1. перевод базы
  2. переводчик

структура перевода является компилятором. Он компилирует 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 framework (из которых есть ряд на разных этапах польского языка). И все интерпретаторы, использующие фреймворк PyPy, автоматически поддерживают все платформы, поддерживаемые рамки.

и он может запустить вашу программу Python быстрее (возможно.)

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

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

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

ваш вопрос, похоже, ожидает, что интерпретатор PyPy работает поверх CPython при выполнении кода. Edit: Да, он сначала переводить в PyPy Python-кода, либо C и построить с ССЗ, в байт-код для JVM, или .Net код Кинк. Смотрите Начало Работы

Comments

    Ничего не найдено.