Почему я не должен использовать PyPy над CPython, если PyPy в 6,3 раза быстрее?
Я много слышал о пользователей. Они утверждают, что это в 6,3 раза быстрее, чем CPython переводчик их сайт.
всякий раз, когда мы говорим о динамических языках, таких как Python, скорость является одним из главных вопросов. Чтобы решить эту проблему, они говорят, что PyPy в 6,3 раза быстрее.
второй вопрос-это параллелизм, печально известный Глобальная Переводчик Замок (Гиль). Для этого, Пипи говорит это могу дать Gil-less Python.
Если PyPy может решить эти большие проблемы,каковы его слабые стороны, которые препятствуют более широкому принятию? То есть, что мешает кому-то вроде меня, типичного разработчика Python, переключиться на PyPy прямо сейчас?
10 ответов:
- PyPy, как другие быстро упоминали, имеет слабая поддержка расширений C. Это и поддержка, но обычно на более медленных, чем Python скоростях, и это в лучшем случае сомнительно. Отсюда много модулей просто требуются CPython. Цитон и Numpy являются высокий для цифр, и большинство людей, которые на самом деле нуждаются в скорости в Python, используют их (+ панды, SciPy и т. д.) тяжело. Поскольку они либо не существуют, либо слабо поддерживаются и медленно люди, которым нужен быстрый Python часто лучше с CPython как для скорости, так и для простоты использования.
- поддержка Python 3
экспериментальная на данный момент.только что достиг стабильный! По состоянию на 20 июня 2014 года, PyPy3 2.3.1-точка опоры отсутствует!- в PyPy иногда не на самом деле быстрее для "скриптов", для которых многие люди используют Python. Это краткосрочные программы, которые что-то делают простой и маленький. Поскольку PyPy является JIT-компилятором, его основные преимущества связаны с длительным временем работы и простыми типами (такими как числа). Честно говоря,он пре-Джит скорости очень плохо по сравнению с CPython.
- инерции. Переезд в 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 раза быстрее.