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


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

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

второй вопрос-это параллелизм, печально известный Глобальная Переводчик Замок (Гиль). Для этого, Пипи говорит это могу дать Gil-less Python.

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

10 605

10 ответов:

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

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

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

вот сайт не утверждение PyPy в 6,3 раза быстрее, чем CPython. Цитирую:

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

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

чтобы сломать это:

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

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

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

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

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

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

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

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

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

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

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

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


Q: почему я не могу сделать падение в замене CPython на PyPy сейчас?

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

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

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

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

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

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

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

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

Я нашел примеры, где PyPy медленнее, чем Python. Но: только на окнах.

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))

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