2010-06-03 4 views
40

Примечание: заголовок преднамеренно провокационный (чтобы вы нажимали на него и хотели закрыть вопрос), и я не хочу выглядеть озабоченным.PyPy: О чем все жужжание?

Я читал и слышал все больше и больше о PyPy. Это похоже на линейный граф.

  • Почему PyPy такой особенный? Насколько я знаю, реализация динамических языков, написанных на самих языках, не такая уж редкая вещь, или я ничего не получаю?

  • Некоторые люди даже называют PyPy «будущим» [python] или видят какой-то глубокий потенциал в этой реализации. В чем именно смысл этого?

+6

Что волнует? – fmark

+0

На самом деле слово «провокационное», которое, я считаю, является «мангиш» для «провокационного». – martineau

+22

Должен признаться, что я немного испорчен –

ответ

10

Отличная вещь о PyPy (в стороне от быстро и написано в RPython (подмножество языка Python), так что в основном бутстрапированный, является то, что он может обеспечить автоматически созданный JIT (только во время компилятора) для любой программы, вы пишете в PyPy:. это делает его идеальным для реализации, быстро, свой собственный язык и он довольно быстро

подробнее here

4

Поскольку большинство из нас согласится, что легче писать Python, чем C, интерпретатор Python, написанный на Python (ну, технически RPython), должен быть способен значительно модифицироваться и с меньшими ошибками, чем CPython.

5

Не говоря уже о том, что они совсем недавно превысили скорость CPython на некоторых тестах. По-моему, их блог. Я не могу достать его отсюда:

http://morepypy.blogspot.com/

45

Хорошая вещь, чтобы быть в курсе, когда речь идет о проекте PyPy в том, что она направлена ​​на самом деле обеспечивают два конечные результаты: первый является JIT компилятор генератор. Да, генератор, что означает, что они реализуют структуру для написания реализаций высокодинамичных языков программирования, таких как Python. Второй - это фактический тест этой структуры, и это реализация интерпретатора PyPy Python .

Теперь есть несколько ответов, почему PyPy является настолько особенным: разработка проекта работает с 2004 года, начата как исследовательский проект, а не из компании, повторно использует Python в Python, реализует JIT-компилятор на Python и может переводить RPython (код Python с некоторыми ограничениями для того, чтобы инфраструктура могла перевести этот код на C) в скомпилированный двоичный файл.

Текущая версия PyPy 99% совместима с CPython версии 2.5 и может запускать Django, Twisted и многие другие программы Python. Раньше существовало ограничение на невозможность запуска существующих расширений CPython C, но это также рассматривается с помощью модуля cpyext в PyPy. Совместимость C API возможна и в некоторой степени уже реализована. JIT также очень реальна, см. Это сравнение pystone.

С CPython:

Python 2.5.5 (r255:77872, Apr 21 2010, 08:44:16) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from test import pystone 
>>> pystone.main(1000000) 
Pystone(1.1) time for 1000000 passes = 12.28 
This machine benchmarks at 81433.2 pystones/second 

С PyPy:

Python 2.5.2 (75632, Jun 28 2010, 14:03:25) 
[PyPy 1.3.0] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
And now for something completely different: ``A radioactive cat has 18 
half-lives.'' 
>>>> from test import pystone 
>>>> pystone.main(1000000) 
Pystone(1.1) time for 1000000 passes = 1.50009 
This machine benchmarks at 666625 pystones/second 

Таким образом, вы можете получить почти 10x ускорение только с помощью PyPy по некоторым подсчетам!

Так как проект PyPy медленно созревает и предлагает некоторые преимущества, он привлекает больше интереса со стороны людей, пытающихся решить проблемы скорости в своем коде. Альтернативой PyPy является проглатывание без рекламы (проект Google), целью которого является ускорение реализации CPython с использованием возможностей JIT LLVM, но прогресс в проглатывании запаса замедлился, потому что разработчику необходимо было иметь дело с ошибками в LLVM.

Итак, чтобы подвести итог, я полагаю, что PyPy считается будущим Python, потому что он отделяет спецификацию языка от реализации VM. Особенности, введенные, например. Stackless Python, затем может быть реализован в PyPy с очень небольшими дополнительными усилиями, поскольку он просто изменяет спецификацию языка, и вы сохраняете общий код одинаковым. Меньше кода, меньше ошибок, меньше слияния, меньше усилий.

И, написав, например, новую реализацию оболочки bash в RPython, вы можете бесплатно получить компилятор JIT и ускорить многие сценарии оболочки Linux, не изучая при этом каких-либо тяжелых знаний JIT.

+13

Позвольте мне понять это прямо. Интерпретатор Python, написанный на Python и работающий на другом интерпретаторе Python, написанном на языке С, может выполнять другие программы Python быстрее, чем тот, на котором он сам работает? Если это так, похоже, вы могли бы сделать это еще на нескольких уровнях и иметь что-то невероятно быстро ... – martineau

+13

Интерпретатор PyPy Python не работает быстро, когда вы запускаете его на CPython. Это быстро, когда вы загружаете его из другого интерпретатора Python, чтобы иметь возможность запускать * самостоятельно *. Поэтому добавление большего количества интерпретаторов в стеке не сделает ничего быстрее, извините.:) –

+4

Чтобы очистить это: интерпретатор PyPy является исполняемым. Он написан в RPython, но этот RPython скомпилирован с помощью PyPy-переводчика. Вы по существу загружаете его при компиляции интерпретатора PyPy (потому что вы, вероятно, будете использовать CPython для запуска транслятора, который компилирует интерпретатор), но как только интерпретатор будет скомпилирован, он будет автономным. Поэтому только потому, что он написан на Python, это не значит, что он должен запускаться на интерпретаторе Python. –

21

Давайте увидим это так ... Предположим, вы хотите реализовать свой собственный динамический язык, и вы хотите быстро его выполнить. У вас есть два варианта: жесткий путь и пипы.

Жесткий путь означает написание вашего интерпретатора в c, а затем реализовать jit вручную, также в c, используя сочетание очень сложных методов, таких как метод-jit, threaded-jit, tracing jit, полиморфные встроенные кеши , инвариант цикла движения и т.д., и т.д. ... в течение нескольких лет настраивая его, и если вы упорно много, и вы не сдавайтесь, вы можете в конечном итоге с быстрой реализации динамического языка.

Или вы можете использовать pypy framework. Это означает, что написание вашего интерпретатора в python вместо c (на самом деле это будет rpython, более ограниченное подмножество python, которое можно скомпилировать с помощью c). Как только вы написали своего переводчика, pypy автоматически сгенерирует jit бесплатно. И вы в основном делаете.

Звучит неплохо, да?

+0

+1 для 'Предположим, вы хотите реализовать свой собственный динамический язык, и вы хотите сделать его быстрым. У вас есть два варианта: жесткий путь и пипы. – IronManMark20