Почему я не должен использовать PyPy над CPython, если PyPy в 6,3 раза быстрее?

Я много слышал о проекте PyPy. Они утверждают, что в 6,3 раза быстрее, чем CPython интерпретатор на их сайт.

Всякий раз, когда мы говорим о динамических языках, таких как Python, скорость является одной из главных проблем. Чтобы решить эту проблему, говорят, что PyPy в 6,3 раза быстрее.

Вторая проблема - parallelism, печально известный Global Interpreter Lock (GIL). Для этого PyPy говорит, что может дать GIL-less Python.

Если PyPy может решить эти большие проблемы, каковы его недостатки, препятствующие более широкому внедрению? То есть, что препятствует тому, чтобы кто-то вроде меня, типичный разработчик Python, переключился на PyPy прямо сейчас?

Ответ 1

  • PyPy, как часто говорили другие, имеет незначительную поддержку расширений C. Он имеет поддержку, но, как правило, на скорости медленнее, чем на Python, и в лучшем случае. Следовательно, для многих модулей просто требуется CPython. Cython и Numpy являются отличными для численных моделей, и большинство людей, которые действительно нуждаются в скорости на Python, сильно используют те (+ Pandas, SciPy и т.д.). Поскольку они либо несуществующие, либо слабо поддерживаемые, и медленные люди, которым нужен быстрый Python, часто лучше с CPython как для скорости, так и для удобства использования.
  • Поддержка Python 3 является экспериментальной на данный момент. только что достиг стабильной! По состоянию на 20 июня 2014 года PyPy3 2.3.1 - Fulcrum отсутствует!
  • PyPy иногда на самом деле не быстрее для "скриптов", для которых многие используют Python. Это краткосрочные программы, которые делают что-то простое и маленькое. Поскольку PyPy является JIT-компилятором, его основные преимущества исходят из длительного времени и простых типов (например, числа). Честно говоря, скорости PyPy до JIT довольно плохие по сравнению с CPython.
  • Инерция. Переход на PyPy часто требует переоборудования, что для некоторых людей и организаций просто слишком много работает.

Это основные причины, которые влияют на меня, я бы сказал.

ПРИМЕЧАНИЕ: Этот вопрос древний! Избегайте делать выводы из устаревшей информации.

Ответ 2

Этот сайт делает запрос не. PyPy в 6,3 раза быстрее, чем CPython. Цитировать:

Среднее геометрическое значение всех эталонных значений составляет 0,16 или 6,3 раза быстрее, чем CPython

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

Чтобы прервать это:

  • Заявление, которое они делают, применимо только к тем критериям, которые они использовали. Он абсолютно ничего не говорит о вашей программе (если ваша программа не совпадает с одной из своих тестов).

  • Заявление относится к среднему группе тестов. Нет никаких утверждений, что запуск PyPy даст улучшение в 6,3 раза даже для программ, которые они тестировали.

  • Нет никаких утверждений, что PyPy даже запустит все программы, которые CPython запускает вообще, не говоря уже об ускорении.

Ответ 3

Поскольку pypy не совместим с 100%, он принимает 8 гигабайтов для компиляции, является движущейся целью и очень экспериментальным, где cpython является стабильным, цель по умолчанию для разработчиков модулей в течение 2 десятилетий (включая c расширения, которые не работа на pypy), и уже широко развернуты.

Pypy, вероятно, никогда не будет эталонной реализацией, но это хороший инструмент.

Ответ 4

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

Что касается первого вопроса, я полагаю, что это своего рода Catch-22 с первым: PyPy развивается быстро, стремясь улучшить скорость и повысить функциональную совместимость с другим кодом. Это сделало его более экспериментальным, чем официальным.

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

Ответ 5

Q: Если PyPy может решить эти большие проблемы (скорость, потребление памяти, parallelism) по сравнению с CPython, каковы его недостатки, которые препятствуют более широкому внедрению?

A: Во-первых, мало что свидетельствует о том, что команда PyPy может решить проблему скорости вообще. Долгосрочные доказательства показывают, что PyPy использует определенные коды Python медленнее, чем CPython, и этот недостаток, по-видимому, очень глубоко внедрен в PyPy.

Во-вторых, текущая версия PyPy потребляет гораздо больше памяти, чем CPython, в довольно большом наборе случаев. Поэтому PyPy еще не решила проблему с потреблением памяти.

Решает ли PyPy вышеупомянутые большие проблемы и будет в целом быть быстрее, меньше голодной памяти и более дружелюбен к parallelism, чем CPython - открытый вопрос, который не может быть разрешен в краткосрочной перспективе. Некоторые люди делают ставку на то, что PyPy никогда не сможет предложить решение общего, позволяющее во всех случаях доминировать над CPython 2.7 и 3.3.

Если PyPy будет лучше, чем CPython в целом, что является сомнительным, основной слабостью, влияющей на ее более широкое внедрение, будет его совместимость с CPython. Также существуют такие проблемы, как тот факт, что CPython работает на более широком диапазоне процессоров и ОС, но эти проблемы гораздо менее важны по сравнению с задачами PyPy и целями совместимости с CPython.


В: Почему я не могу сейчас заменить CPython на PyPy?

A: PyPy не на 100% совместим с CPython, потому что он не имитирует CPython под капотом. Некоторые программы могут по-прежнему зависеть от уникальных функций CPython, отсутствующих в PyPy, таких как привязки C, реализации C объектов объекта и методов Python или инкрементного характера сборщика мусора CPython.

Ответ 6

Я сделал небольшую оценку по этой теме. В то время как многие другие плакаты сделали хорошие советы о совместимости, мой опыт в том, что PyPy не намного быстрее, просто перемещая биты. Для многих применений Python он действительно существует только для перевода бит между двумя или несколькими службами. Например, не многие веб-приложения выполняют интенсивный анализ ЦП массивов. Вместо этого они берут несколько байтов от клиента, сохраняют их в какой-то базе данных и затем возвращают их другим клиентам. Иногда формат данных изменяется.

Разработчики BDFL и CPython представляют собой удивительно интеллектуальную группу людей и имеют возможность помочь CPython отлично работать в таком сценарии. Вот бесстыдный блог-плагин: http://www.hydrogen18.com/blog/unpickling-buffers.html. Я использую Stackless, который получен из CPython и сохраняет полный интерфейс модуля C. В этом случае я не нашел никакого преимущества для использования PyPy.

Ответ 7

CPython имеет подсчет ссылок и сборку мусора, PyPy имеет только сбор мусора.

Таким образом, объекты, как правило, удаляются раньше, а __del__ вызывается более предсказуемым способом в CPython. Некоторое программное обеспечение полагается на это поведение, поэтому они не готовы к миграции на PyPy.

Некоторое другое программное обеспечение работает с обоими, но использует меньше памяти с CPython, поскольку неиспользуемые объекты освобождаются ранее. (У меня нет никаких измерений, чтобы указать, насколько это значимо и какие другие детали реализации влияют на использование памяти.)

Ответ 8

Для большого количества проектов на самом деле существует 0% разница между разными питонами с точки зрения скорости. Это те, на которых доминирует инженерное время, и где все питоны имеют одинаковое количество поддержки библиотеки.

Ответ 9

Чтобы сделать это простым: PyPy обеспечивает скорость, которой не хватает CPython, но жертвует своей совместимостью. Тем не менее, большинство людей выбирают Python для своей гибкости и своей "включенной в батарею" функции (высокая совместимость), а не ее скорости (хотя это все еще предпочтительнее).

Ответ 10

Я нашел примеры, где PyPy медленнее Python. Но: Только для Windows.

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

Итак, если вы думаете о PyPy, забудьте Windows. В Linux вы можете добиться потрясающих ускорений. Пример (список всех простых чисел от 1 до 1 000 000):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

В PyPy выполняется на 10 (!) раз быстрее, чем на Python. Но не на окнах. Там он всего в 3 раза быстрее.