LINUX.ORG.RU

PyPy 1.7

 , ,


0

1

Вышла очередная версия PyPy — интерпретатора языка программирования Python, который написан на Python и может компилировать сам себя. Основным изменением этого выпуска является значительный прирост производительности. В среднем на тестовом пакете, прирост производительности PyPy 1.7 составляет около 30%, по сравнению с PyPy 1.6 и до 20 раз быстрее на некоторых тестах.

Основные изменения:

  • исправление ошибок, совместимость исправлений с CPython;
  • исправления в Windows-версии;
  • в PyPy 1.7 по умолчанию включен stackless;
  • NumPy был переименован в numpypy;
  • JSON encoder заменен на новый, написанный на чистом Python, превосходящий по скорости CPython с расширениями на С в 2 раза;
  • уменьшено потребление памяти некоторыми RPython модулями.

Ссылка для загрузки.

>>> Подробности

★★★★★

Проверено: maxcom ()
Последнее исправление: adriano32 (всего исправлений: 1)

Ответ на: комментарий от namezys

Объясните мне, чем вам не угодил multiprocessing?

Лишняя память, это раз. Невозможность разделять адрессное пространство - это два.

Вот мы пишем сервер, который грузит в память около 3 Гб данных. Так на все 24 ядра на машиен сколько надо памяти?

Для такого объёма данных, пожалуй. Я не специалист в web. При решении чисто вычислительных задач одновременно грузить в память более 100Mb приходится ооочень редко. Как следствие, памяти действительно уходит больше, но это некритично.

Адресное пространство разделять можно частично. Можно объявить часть переменных общими, кроме того, есть процессы созданы внутри метода класса, они знают все его поля и методы.

Vudod ★★★★★
()
Ответ на: комментарий от anonymous

А ты не улыбайся, а просто цифру назови.

А ты угадай с трех раз. И еще на досуге подумай, почему это не важно.

baverman ★★★
()
Ответ на: комментарий от anonymous

worker - это отдельный процесс в смысле процесса ОС?

Именно. Для веб-задач это стандартный паттерн.

Если нужно IPC между процессами то multiprocessing с очередями итп. Работает через shmem.

true_admin ★★★★★
()
Ответ на: комментарий от anonymous

эти гринлеты - это какие-то костыли

Наоборот избавление от тех костылей что навязываются aio(всякие коллбэки итп).

сколько гринлетов можно исполнять параллельно на потоках ОС?

Ммм, gevent.fork() и вперёд :)

true_admin ★★★★★
()
Ответ на: комментарий от baverman

А теперь представь, что интерпретатор начал исполнение долгоиграющего запроса к базе, все остальные 1000 потоков тупо заблокированы

Nope. man select.

Про базу может был и не удачный пример, но что делать с файловым I/O? Я вот не припомню, чтобы там была польза от select. Переходить на AIO? Это уже весело может получиться.

Casus ★★★★★
()
Ответ на: комментарий от Vudod

> Адресное пространство разделять можно частично.

Что-то я слабо представляю, как в питоне это работает. Данные объекта еще можно разделить. А вот структуру? Счетчики поддерживать когюретно по всем потокам? Сомнительно это.

namezys ★★★★
()
Ответ на: комментарий от Casus

> И так в каждой версии!

Я вообще про json говорил. А то что каждая версия быстрее, говорит лишь об одном - классчиеский питон очень медленный.

namezys ★★★★
()
Ответ на: комментарий от matumba

Разработчики на Django слушают тебя с недоумением)))))

anonymous
()
Ответ на: комментарий от namezys

Что-то я слабо представляю, как в питоне это работает. Данные объекта еще можно разделить. А вот структуру? Счетчики поддерживать когюретно по всем потокам? Сомнительно это.

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

Vudod ★★★★★
()
Ответ на: комментарий от Casus

Про базу может был и не удачный пример, но что делать с файловым I/O?

Я неудачно выразился. При любом IO питон переключает на другие потоки.

baverman ★★★
()
Ответ на: комментарий от Vudod

> В руководстве написано, что можно разделять простые типы: массивы чисел и строки. Для этого их нужно соответствующим образом объявить.

Во, то есть разделение данных. В общем это все «костыль». Но часто это и не надо.

namezys ★★★★
()
Ответ на: комментарий от Vudod

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

anonymous
()
Ответ на: комментарий от anonymous

> А теперь представь, что интерпретатор начал исполнение долгоиграющего запроса к базе, все остальные 1000 потоков тупо заблокированы, возникает вопрос о какой маштабируемости тут может идти речь?

При выполнении системных вызовов типа чтения-записи в файловый дескриптор GIL освобождается.

shimon ★★★★★
()
Ответ на: комментарий от shimon

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

anonymous
()
Ответ на: комментарий от namezys

Во, то есть разделение данных. В общем это все «костыль». Но часто это и не надо.

Мне это особо не надо. Я действую достаточно просто: процесс создаётся, ещё выделяется функция на выполнение, туда передаётся очередь --- экземпляр класса Queue, из неё забираются нужные данные (часть данных общие для класса), расчёты производятся, результаты помещаются в очередь и возвращаются главному потоку. При времени выполнения такого потока в несколько секунд затраты на создание и обмен данными пренебрежимо малы.

Vudod ★★★★★
()
Ответ на: комментарий от anonymous

вот это является узким местом

В *большинстве* *веб* приложений узкое место — бд. Если ты хочешь выполнять тяжелые вычисления посреди реквеста, ты явно странный тип.

baverman ★★★
()
Ответ на: комментарий от baverman

А где мне его выполнять? Если параметры следущего запроса зависят от этих вычислений? Но я хочу его выполнять параллельно, то есть запустил поток и забыл про него, когда данные становятся нужны - я их просто достаю из объекта.

anonymous
()
Ответ на: комментарий от namezys

Я вообще про json говорил. А то что каждая версия быстрее, говорит лишь об одном - классчиеский питон очень медленный.

Ну так изменение алгоритма никак не связано с языком реализации в данном случае то. Т.е. тот же изменённый алгоритм на CPython будет так же быстрее.

Casus ★★★★★
()
Ответ на: комментарий от baverman

В *большинстве* *веб* приложений узкое место — бд

Это если само приложение нифига толком не делает. БД как раз можно, зачастую, оптимизировать.

Casus ★★★★★
()
Ответ на: комментарий от anonymous

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

Расскажите это Брайту и Александреску. Они специально сделали потоки изолированными по пространству имён и велят в явном виде описывать, какие переменные общие.

Vudod ★★★★★
()
Ответ на: комментарий от Casus

> Ну так изменение алгоритма никак не связано с языком реализации в данном случае то. Т.е. тот же изменённый алгоритм на CPython будет так же быстрее.

CPythone медлененее PyPy. На нем реализация чего-то оказалась мделенее, чем аналогичные действия на С, но с другой релаизацией. А вот на PyPy оказалось быстрее.

namezys ★★★★
()
Ответ на: комментарий от Casus

То, о чём ты думаешь, возможно только если внутренний FIO сделан через AIO.

Shimon же дал верное пояснение. Перед началом блокирующего IO освобождается GIL. Так что AIO здесь не при делах.

baverman ★★★
()
Ответ на: комментарий от Casus

Это если само приложение нифига толком не делает.

Таких приложений большинство. Тупые мордочки по доставанию данных из бд и вкорячиванию переменных в шаблоны. О том и речь.

baverman ★★★
()
Ответ на: комментарий от Vudod

>> Я указал, что multiprocessing к многопоточности отношения не имеет.

Это есть неверное суждение, либо вы используете специфичную терминологию.

Случай, что неправильную терминологию используешь ты, не рассматривается?

Multiprocessing повторяет функциональность threading почти полностью

Я не хуже тебя знаю, что такое multiprocessing. Он может сколько угодно повторять API модуля threading, но нити запускаются в едином адресном пространстве, а процессы - нет.

Поэтому я считаю, что вы совершенно напрасно вводите людей в заблуждение

А я считаю, что ты не освоил базовых понятий многозадачности и базовых навыков чтения.

tailgunner ★★★★★
()
Ответ на: комментарий от Vudod

>потоки изолированными по пространству имён

Не понял эту мысль. Все потоки в линуксе сделаны на базе pthreads, а там вроде нет пространства имен, или я чего то пропустил? И при чем тут Александреску?

anonymous
()
Ответ на: комментарий от matumba

>генерацию HTML из кода (т.е. не print «<BR>», а html->br()).

(response/xexpr '(html (head (title «My Blog»)) (body (h1 «Under construction»))))

Короче, Python — 1991, Perl — 1987. Вопросы?

Lisp - 1958, ну ты понял.

loz ★★★★★
()
Ответ на: комментарий от baverman

А как узнать, что данные готовы и передать указатель на объект содержащий результаты из одного процесса в другой, после смерти этого «отдельного» процесса?

anonymous
()
Ответ на: комментарий от tailgunner

Я не хуже тебя знаю, что такое multiprocessing.

Пока вы не подтвердили это суждение ни одним высказыванием.

Он может сколько угодно повторять API модуля threading, но нити запускаются в едином адресном пространстве, а процессы - нет.

Для программиста на Питоне это не существенно. Для него существенно, что нити --- в данном случае процессы, выполняются параллельно. Вопрос разделения адресного пространства обсуждался выше.

А я считаю, что ты не освоил базовых понятий многозадачности

Это ваше мнение мне безразлично, потому что у меня программы работают нужным мне способом и распараллеливание происходит.

и базовых навыков чтения.

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

Vudod ★★★★★
()

Привет Пёрл и Раби

Класс, скоро у Пистона будет JIT. Привет Пёрл и Раби.

mantar
()
Ответ на: комментарий от anonymous

А как узнать, что данные готовы и передать указатель на объект содержащий результаты из одного процесса в другой, после смерти этого «отдельного» процесса?

Для этого есть тысяча способов. Тот же multiprocessing предоставляет удобные абстракции.

baverman ★★★
()
Ответ на: комментарий от anonymous

Не понял эту мысль. Все потоки в линуксе сделаны на базе pthreads, а там вроде нет пространства имен, или я чего то пропустил? И при чем тут Александреску?

Я плохо выразился. При проектировании языка D по умолчанию они специально запретили обращение к переменным из разных потоков, если вы хотите использовать одну и ту же переменную в нескольких потоках, вы должны это декларировать явно. Хотя физическое разделение памяти не происходит, потоки работают в одном пространстве памяти, логическое разделение имеет место.

Vudod ★★★★★
()
Ответ на: комментарий от Vudod

> Для программиста на Питоне это не существенно.

Зависит от многих условий. Для тебя - может быть, и несущественно.

Хамство может считаться признаком крутизны только в весьма специфических коллективах

Ты это начал.

я рад, что не работаю с вами в одном и том же.

А тебе это было бы полезно.

tailgunner ★★★★★
()
Ответ на: комментарий от Vudod

Для программиста на Питоне это не существенно

Утиные истории. Сам таким был, понимаю. На практике, отличия multiprocessing от threading надо досконально знать. От деталей там никак не абстрагироваться.

baverman ★★★
()
Ответ на: комментарий от baverman

Мне страшно интересно, а какой смысл имеет указатель на объект в другом адресном пространстве другого процесса?

anonymous
()
Ответ на: комментарий от anonymous

Мне страшно интересно, а какой смысл имеет указатель на объект в другом адресном пространстве другого процесса?

Дополнительного смысла, по сравнению с процессом родителем, не появляется.

baverman ★★★
()
Ответ на: комментарий от anonymous

> Использование процессов для эмуляции потоков сейчас выглядить редким идиотизмом, особенно для линукса и особенно для задач, требующих высокой производительности.

Ну да, ну да. Особенно это видно по современным надежным программам....

demmsnt
()
Ответ на: комментарий от namezys

классчиеский питон очень медленный

клинический тормоз - очень медленный

что до производительности питона, то её достаточно для решения широкого класса задач, только писать надо уметь

shty ★★★★★
()
Ответ на: комментарий от Vudod

>вы должны это декларировать явно

А зачем? Компилятор автоматически создаст примитив синхронизации и сделает доступ к переменной безопасным? Как-то я не вижу особого смысла в этом.

anonymous
()
Ответ на: комментарий от Vudod

Расскажите это Брайту и Александреску.

только после того как они допилят свою поделку, то есть - никогда

shty ★★★★★
()
Ответ на: комментарий от anonymous

> Компилятор автоматически создаст примитив синхронизации и сделает доступ к переменной безопасным?

Ровно наоборот. Если переменная не помечена как shared, она считается локальной для нити, и компилятор генерирует соотвествующий код. Если она помечена как shared, она, внезапно, shared :) И компилятор генерирует другой код.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Lisp - 1958, ну ты понял

Ну то же LISP, а не «There's more than one way to screw it up»

то есть LISP - это «One way to screw it up»?

shty ★★★★★
()
Ответ на: комментарий от baverman

Очень уклончивый ответ, я примерно представляю как передать объект из одного процесса в другой. Это сериализация?

anonymous
()
Ответ на: комментарий от namezys

Вот мы пишем сервер, который грузит в память около 3 Гб данных. Так на все 24 ядра на машиен сколько надо памяти?

Тут стандартный пистон без стероидов не подходит. Правда, вменяемых стероидов я не знаю.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.