Быстро ли обрабатывает pypy потоки и сокеты по сравнению с написанным от руки C? - PullRequest
7 голосов
/ 26 февраля 2012

Быстро ли pypy обрабатывает потоки и сокеты по сравнению с написанным от руки C?По сравнению с обычным python?

Я бы просто попробовал, но рассматриваемый код python был написан для небольшого кластера компьютеров, на котором я не являюсь администратором.Я спрашиваю здесь, потому что мои попытки Google дали только сравнение с Cython, без загрузки, и т.д.на самом деле нужно, чтобы Pypy был так же хорош в C;Я собираюсь использовать его, потому что сейчас накладные расходы интерпретатора полностью затмевают вычисления, которые я пытаюсь рассчитать.Мне просто нужен pypy, чтобы я оказался рядом с рукописным буквой C.

Ответы [ 3 ]

12 голосов
/ 25 марта 2012

Быстро ли обрабатывает pypy потоки и сокеты по сравнению с написанным от руки C?

Нет.Обычно это то же самое или хуже.

PyPy сохраняет глобальную блокировку интерпретатора (GIL), которую имеет CPython.Это означает, что собственные потоки не могут запускать код Python параллельно.Потоки Python также имеют дополнительную семантику, которая обходится дорого.Большая часть синхронизации окружает запуск потока Python, завершение работы и отслеживание объектов потока.Для сравнения, потоки C будут запускаться быстрее, дешевле в использовании и могут работать полностью параллельно.

Эффективная обработка сокетов требует минимизации времени, не затрачиваемого на ожидание следующего события сокета.Поскольку модель потоков PyPy по-прежнему связана с GIL, это означает, что потоки, которые возвращаются из блокирующих вызовов сокетов, не могут продолжаться, пока не получат GIL.Эквивалентный код C обычно выполняется быстрее и может быстрее вернуться к ожиданию событий сокета.

По сравнению с обычным питоном?

Да.Но не сильно.

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

Я бы просто попробовал, но рассматриваемый код на python был написан для небольшого кластера компьютеров, на котором я не являюсь администратором.Я спрашиваю здесь, потому что мои попытки Google дали только сравнение с Cython, без загрузки, ласточка и т. Д., И я не хочу, чтобы ошибка администратора об этом, если это вряд ли сработает.

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

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

Сокращение разрыва в производительности с помощью C в настоящее время является единственной отличительной особенностью PyPy.Я настоятельно рекомендую вам попробовать.

1 голос
/ 26 февраля 2012

Он должен обрабатывать сокеты и потоки довольно быстро, я не могу заверить вас, что он будет работать так же быстро, как C, PyPy использует средства защиты, чтобы убедиться, что значения приемлемы для запуска в функции C.Поскольку PyPy использует JIT, он обеспечивает наибольшее увеличение производительности в случае больших циклов.Вы можете взглянуть на тесты скорости pypy здесь

0 голосов
/ 19 марта 2012

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

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

...