Как PyPy ускоряет Python до уровня C?
Python — идеальный инструмент для того, чтобы мы перестали беспокоиться о разных рутинных вещах, вроде шаблонного кода, и сосредоточились на реализации идеи.
Однако стоит обсудить существенный недостаток: выполнение кода на стандартном интерпретаторе Python потребует больше времени, чем компилируемые языки, такие как C или C++. И что же делать, когда идея проверена, прототип успешно реализован на Python, и хочется наконец-то превратить его в готовый, быстрый, производительный инструмент? Популярное решение — проделать двойную работу, вручную преобразовывая Python-код в код на C. Но разве не было бы здорово, если бы прототип смог работать достаточно быстро на Python? Все время, потраченное на двойную реализацию, можно было бы направить на создание чего-то более значимого и интересного.
К счастью, существует PyPy — быстрая альтернатива стандартному интерпретатору Python.
Чтобы проиллюстрировать, насколько PyPy способен ускорить выполнение кода, можно запустить стандартный интерпретатор Python вместе с PyPy:
Интерпретация Языка
Python, JavaScript, PHP и подобные языки используют другой подход. Они интерпретируются. По сравнению с преобразованием исходного кода в машинный код, исходный код остается нетронутым. Каждый раз при запуске программы интерпретатор просматривает код построчно и выполняет его.
В случае с JavaScript интерпретатор встроен в каждый веб-браузер, а интерпретатор Python необходимо устанавливать отдельно. Стандартный интерпретатор Python с веб-сайта python.org называется CPython. Однако важно различать Python как язык и CPython как программу-интерпретатор, которая выполняет код на языке Python. Это связано с тем, что существуют совершенно разные инструменты для выполнения кода, написанного на Python. Именно здесь в дело вступает PyPy.
Компиляция точно в срок (Just-In-Time Compilation)
PyPy — это альтернативная реализация Python, использующая компиляцию “точно в срок”. Принцип работы таков: PyPy запускается как интерпретатор, выполняющий код Python напрямую из исходных файлов. Однако вместо того, чтобы выполнять код построчно, PyPy компилирует части кода в машинный код непосредственно перед его выполнением, так сказать, вовремя.
В этом смысле JIT-компиляцию можно назвать сочетанием производительности опережающей компиляции с гибкостью и кроссплатформенностью интерпретируемых языков.
Так в чем же польза PyPy?
Теперь, когда стало понятно, как же PyPy достигает своего поразительного прироста производительности, хочется сразу использовать его. PyPy доступен на сайте pypy.org и легко устанавливается. Помимо самого инструмента, на сайте можно ознакомиться со множеством советов и рекомендаций по тонкой настройке Python-программы для еще большего увеличения производительности. Поскольку PyPy — это альтернативная реализация интерпретатора Python, то в большинстве случаев он просто работает “из коробки” без каких-либо изменений вашего проекта. Он полностью совместим с веб-фреймворком Django, пакетом для научных вычислений Numpy и множеством других пакетов. PyPy сэкономит вам бесчисленное количество часов, позволяя не переписывать свои программы на Python ради скорости выполнения, и его уж точно нельзя упустить из своего набора инструментов для разработки программного обеспечения.
- Python/C API — ускорение Python при помощи кода на C
- Новинка Python 3.10: оператор переключения Structural pattern matching
- List Comprehensions в Python за 5 минут
PyPy3, полноценная замена классического Python3
«Если необходимо, чтобы Ваш код работал быстрее,
то вероятно, следует просто использовать PyPy»Гвидо ван Россум (создатель Python).
Общие сведения о PyPy.
Компилятор PyPy3 — это полноценная замена CPython. Он построен с использованием языка RPython, который был разработан совместно с ним. Основная причина использовать его вместо CPython — скорость: обычно он работает быстрее.
Цель PyPy — получить скорость, но при этом поддерживать (в идеале) любую программу Python.
На момент апреля 2023 года выпуск PyPy 7.3, реализует три максимальные версии — это Python 3.8 и Python 3.9. Он поддерживает почти весь синтаксис CPython (с небольшими изменениями) и проходит набор тестов Python. Выпуск PyPy 7.3.9 поддерживает большинство используемых модулей стандартной библиотеки Python. Известные различия с CPython смотрите в разделе совместимости.
- интерпретатор PyPy3.8 поддерживает синтаксис и функции Python 3.8, включая стандартную библиотеку для CPython 3.8.
- интерпретатор PyPy3.9 поддерживает синтаксис и функции Python 3.9, включая стандартную библиотеку для CPython 3.9.
Интерпретаторы основаны на одной и той же кодовой базе, поэтому они имеют несколько выпусков. Все API совместимы с другими выпусками PyPy7.3. Основные моменты, начиная с выпуска 7.3.8 включают:
- Исправлены некоторые неудачные тесты стандартной библиотеки на PyPy3.9.
- Обновлен связанная системная библиотека libexpat до 2.4.6 и sqlite3 до версии 3.38.2.
Поддерживаются и обслуживаются следующие архитектуры ЦП:
- x86 (IA-32) и x86_64,
- платформа ARM (ARMv6 or ARMv7, with VFPv3),
- AArch64,
- PowerPC 64bit как с прямым, так и с обратным порядком байтов,
- System Z (s390x),
Скорость исполнения кода компилятором PyPy.
Основной исполняемый файл pypy поставляется с компилятором Just-in-Time. Он действительно быстро запускает большинство тестов, включая очень большие и сложные приложения Python, а не только 10-строчные.
Два случая, когда PyPy не сможет ускорить код:
- Кратковременные процессы: если PyPy запускается со скриптами работающими меньше 2-х секунд, JIT-компилятору не хватит времени для разгона.
- JIT-компилятор не поможет, если все время исполнения программы тратится в подключаемых C-библиотеках, а не на выполнение кода, написанного на Python.
Таким образом, лучше всего PyPy работает при выполнении длительно выполняющихся программ, когда значительная часть времени тратится на выполнение кода Python. Это случай, охватываемый большинством проводимых тестов.
Установка PyPy3 на ОС Windows:
Установка PyPy3 ни чем не отличается от установки классического Python3. Загрузить исходники PyPy3 для ОС Windows можно с официальной страницы. Дистрибутив PyPy3 Windows 32 bit совместим с любыми 32- или 64-битными ОС Windows.
Так же, может понадобиться установщик библиотеки времени выполнения VC. Загрузить файл vcredist.x86.exe можно с официальной страницы https://www.pypy.org
PyPy3 для ОС Windows готов к запуску сразу после установки из .exe или .msi файла.
Установка PyPy3 на Linux (ОС Ubuntu/Debian):
Команда разработчиков PyPy предоставляет предварительно скомпилированные двоичные файлы для многих платформ и ОС. Загрузить исходники PyPy3 можно с официальной страницы.
PyPy готов к запуску сразу после распаковки его из tarball или zip-архива, без необходимости устанавливать его в каком-либо конкретном месте:
# разархивируем pypy3.9 в директорию `/opt` $ sudo tar xf pypy3.9-v7.3.11-linux64.tar.bz2 -C /opt $ /opt/pypy3.9-v7.3.11-linux64/bin/pypy # Python 3.9.16 (Dec 29 2022, 14:23:21) # [PyPy 7.3.11 with GCC 10.2.1 20210130 (Red Hat 10.2.1-11)] on linux # Type "help", "copyright", "credits" or "license" for more information. # >>>>
Если необходимо сделать PyPy доступным для всей системы, то можно создать символическую ссылку на исполняемый файл ln -s /opt/pypy3.7-v7.3.7-linux64/bin/pypy /usr/local/bin/pypy . Важно разместить символическую ссылку, а не перемещать туда двоичный файл, иначе PyPy не сможет найти свою библиотеку.
Установка дополнительных модулей для PyPy3.
Если необходимо установить сторонние библиотеки, наиболее удобный способ — установить менеджер пакетов pip с помощью инструмента ensurepip . Если вы не хотите устанавливать virtualenv , то тогда можно напрямую использовать pip внутри виртуальной среды исполнения:
# установка менеджера пакетов `pip` в распакованный # и готовый сразу к запуску дистрибутив $ ./pypy-xxx/bin/pypy -m ensurepip # обновление `pip` до последней версии $ ./pypy-xxx/bin/pypy -m pip install -U pip wheel # пример установки стороннего модуль Flask $ ./pypy-xxx/bin/pypy -m pip install pygments
Если нужно иметь возможность использовать pip непосредственно из командной строки, то необходимо использовать аргумент —default-pip при вызове surepip . Сторонние библиотеки будут установлены в pypy-xxx/site-packages . Как и в случае с CPython, скрипты в linux и macOS будут в pypy-xxx/bin , а в Windows они будут в pypy-xxx/Scripts .
Установка PyPy3 в виртуальную среду исполнения virtualenv .
Наиболее удобно запускать PyPy3 внутри виртуальной среды исполнения virtualenv . Для этого необходимо установить версию virtualenv -1.6.1 или выше. Затем в установленную среду выполнения, можно установить PyPy как из предварительно скомпилированного архива, так и из разархивированной директории, после проверки PyPy3 на работоспособность.
# Установка из распакованной директории $ virtualenv -p /opt/pypy-xxx/bin/pypy env-pypy # активация виртуального аокружения $ source env-pypy/bin/activate # (env-pypy) $
Внимание! Не используйте для установки PyPy3 встроенный модуль venv (т.к. venv не копирует компилятор PyPy, а ставит на него только ссылки), создавайте виртуальную среду исполнения только при помощи virtualenv .
Примечание: Если, все-же решили использовать venv в качестве виртуальной среды, то ни в коем случае не удаляйте распакованный исходник. После удаления исходника, экземпляр pypy, расположенный в venv перестанет работать.
Пример установки PyPy, используя модуль venv :
# запускаем из распакованного исходника /opt/pypy-xxx/bin/pypy -m venv venv-pypy --prompt PYPY3 # активация виртуального окружения $ source env-pypy/bin/activate # (PYPY3) $
Обратите внимание, что env-pypy/bin/python теперь является символической ссылкой на env-pypy/bin/pypy , следовательно можно запускать pypy, просто набрав python .
Для PyPy3, установленного в виртуальную среду, все равно необходимо обновить pip и wheel до последних версий через:
$ env-pypy/bin/pypy -m pip install -U pip wheel
Совместимость с классическим Python3.
Чистый код Python работает, но есть несколько отличий в управлении временем жизни объекта. Модули, использующие CPython C API, вероятно, будут работать, но не достигнут ускорения за счет JIT. Авторам библиотек, команда разработчиков рекомендуем использовать CFFI и HPy.
Если необходимо использовать PyPy3 с научной экосистемой Python, то рекомендуется использовать компилятор Python conda , т.к. он переупаковывают общие библиотеки, такие как scikit-learn и SciPy для PyPy.
Расширения языка C должны быть перекомпилированы для PyPy, чтобы они работали. В зависимости от системы сборки они могут работать из коробки или будет немного сложнее.
В основном PyPy3 поддерживает стандартные библиотечные модули. Обратите внимание, что многие модули python3 реализованы на чистом Python, следовательно они точно будут работать. Просто нужно проверить, сможет ли PyPy3 на вашей системе импортировать следующие модули:
__builtin__ , __pypy__ , _ast , _cffi_backend , _codecs , _collections , _continuation , _csv , _file , _hashlib , _io , _locale , _lsprof , _md5 , _minimal_curses , _multibytecodec , _multiprocessing , _pickle_support , _pypyjson , _random , _rawffi , _sha , _socket , _sre , _ssl , _struct , _testing , _warnings , _weakref , array , binascii , bz2 , cStringIO , cmath , cppyy , cpyext , crypt , errno , exceptions , fcntl , gc , imp , itertools , marshal , math , mmap , operator , parser , posix , pwd , pyexpat , pypyjit , select , signal , symbol , sys , termios , thread , time , token , unicodedata , zipimport , zlib .
Если PyPy3 импортирует вышеуказанные модули без ошибок, то он полностью совместим с вашим Python3 и должен работать без каких либо ошибок.
Поддерживается и написано на чистом Python: cPickle , ctypes , datetime , dbm , _functools , grp , readline , resource , sqlite3 , syslog .
Все сторонние модули, которые написаны на чистым python в CPython, конечно будут работать после успешной установки.
Различия, связанные со стратегиями сбора мусора.
Сборщики мусора, используемые или реализованные PyPy3, не основаны на подсчете ссылок, поэтому объекты не освобождаются мгновенно, когда они больше недоступны. Наиболее очевидный эффект от этого заключается в том, что файлы (и сокеты и т. д.) не закрываются сразу после выхода за пределы области видимости. Это отличие от классического Python3, не будет изменяться командой разработчиков.
Следующий код заполнит файл не сразу, а только через определенный промежуток времени, когда GC выполнит сборку мусора и очистит вывод:
open("filename", "w").write("stuff")
Правильное использование заключается в следующем:
with open("filename", "w") as f: f.write("stuff")
Та же проблема — не закрытие файлов — может также возникнуть, если программа открывает большое количество файлов, не закрывая их явно. В этом случае можно легко достичь системного ограничения на количество файловых дескрипторов, которые разрешено открывать одновременно.
PyPy3 можно запустить с параметром командной строки -X track-resources (например, pypy -X track-resources myprogram.py ). Это вызывает ResourceWarning , когда GC закрывает незакрытый файл или сокет. Также дается трассировка для места, где был открыт файл или сокет, что помогает найти места, где отсутствует метод .close() .
Точно так же помните, что необходимо закрывать неизрасходованный генератор, чтобы ожидающие завершения операторы finally или with выполнялись немедленно:
def mygen(): with foo: yield 42 for x in mygen(): if x == 42: # foo .__ exit__ запускается не сразу! break # Необходимо поступать следующим образом gen = mygen() try: for x in gen: if x == 42: break finally: gen.close()
В более общем смысле, методы __del__() не выполняются так же предсказуемо, как на CPython: в PyPy3 они запускаются через некоторое время (или не запускаются вообще, если программа тем временем завершает работу).
Обратите внимание, что PyPy3 возвращает неиспользуемую память операционной системе, если есть системный вызов madvise() (по крайней мере в Linux, OS X, BSD) или в Windows. Важно понимать, что можно не увидеть этого в выводе команды терминала top .
Неиспользуемые страницы памяти помечаются MADV_FREE , который сообщает системе: Если вам понадобится больше памяти в какой-то момент, возьмите эту страницу. Пока памяти достаточно, столбец RES вверху может оставаться высоким. Исключением из этого правила являются системы без MADV_FREE , где PyPy3 использует MADV_DONTNEED , который принудительно снижает RES (включает Linux
Почему PyPy3 жрет так много памяти?
PyPy3 возвращает неиспользуемую память операционной системе только после системного вызова madvise() (по крайней мере, в Linux, OS X, BSD) или в Windows. Важно понимать, что такое поведение может НЕ показываться топе утилиты bash htop . Неиспользуемые страницы помечаются MADV_FREE , что говорит системе: «Если в какой-то момент понадобится больше памяти, то возьмите эту страницу«. Пока памяти много, верхний столбец RES остается высоким.
Исключением из этого правила являются системы без MADV_FREE , где PyPy3 использует MADV_DONTNEED , что принудительно снижает RES . Это включает Linux = 4.4.
Подклассы встроенных типов
Официально в CPython вообще нет правила, когда точно переопределенный метод подклассов встроенных типов вызывается неявно или нет. В качестве приближения эти методы никогда не вызываются другими встроенными методами того же объекта. Например, переопределенный __getitem__() в подклассе dict не будет вызываться, например, встроенный метод dict.get() .
Сказанное выше верно как для CPython, так и для PyPy. Могут возникнуть различия в том, будет ли встроенная функция или метод вызывать переопределенный метод другого объекта, кроме self . В PyPy они часто вызываются в тех случаях, когда CPython этого не делает.
class D(dict): def __getitem__(self, key): return "%r from D" % (key,) class A(object): pass a = A() a.__dict__ = D() a.foo = "a's own foo" print(a.foo) # CPython => a's own foo # PyPy => 'foo' from D glob = D(foo="base item") loc = <> exec "print foo" in glob, loc # CPython => base item # PyPy => 'foo' from D
Игнорируемые исключения.
Во многих случаях CPython может молча проглатывать исключения. Точный список случаев, когда это происходит, довольно длинный, хотя большинство случаев очень редки. Наиболее известные места — это настраиваемые расширенные методы сравнения (например, __eq__ ); поиск по словарю; вызовы некоторых встроенных функций, таких как isinstance() .
Если это поведение явно не предусмотрено конструкцией и не задокументировано как таковое (например, для hasattr() ), в большинстве случаев PyPy будет поднимать исключения.
Идентичность встроенных типов ( is и id ).
Идентичность объектов примитивных типов работает по равенству значений, а не по идентичности id . Это означает, что x + 1 is x + 1 всегда верно для произвольных целых чисел x . Правило распространяется на следующие встроенные типы:
- int ;
- float ;
- long ;
- complex ;
- str (только пустые или односимвольные строки)`;
- unicode (только пустые или односимвольные строки)`;
- tuple (только пустые кортежи)`;
- frozenset (только пустой frozenset )`.
Это изменение также требует некоторых изменений в id . id выполняет следующее условие: x is y id(x) == id(y) . Поэтому id вышеперечисленных типов будет возвращать значение, которое вычисляется из аргумента, и, таким образом, может быть больше, чем sys.maxint (т. е. может быть произвольно длинным).
Обратите внимание, что строки длиной 2 или более могут быть равны, не будучи идентичными. Аналогично, x is (2,) не обязательно истинно, даже если x содержит кортеж и x == (2,) . Правила уникальности применимы только к частным случаям, описанным выше. Правила str , unicode , tuple и frozenset были добавлены в PyPy выпуск 5.4; до этого тест типа if x is «?» или if x is () мог потерпеть неудачу, даже если x был равен «?» или () . Новое поведение, добавленное в PyPy выпуск 5.4, ближе к CPython, который кэширует именно пустой tuple / frozenset и (как правило, но не всегда) str и unicode длинной
Обратите внимание, что для float существует только один объект на “битовый шаблон” float . Таким образом, float(‘nan’) is float(‘nan’) истинно на PyPy3, но не на CPython, потому что они являются двумя объектами; но 0.0 is -0.0 всегда False , так как битовые шаблоны различны. Как обычно, float(‘nan’) == float(‘nan’) всегда ложно. При использовании в контейнерах (например, в виде элементов list или в set ) точное правило равенства используется так: “ if x is y or x == y ” (как на CPython, так и на PyPy); как следствие, поскольку все nan идентичны в PyPy3, вы не можете иметь несколько из них в множестве set , в отличие от CPython.
Другим следствием является то, что cmp(float(‘nan’), float(‘nan’)) == 0 , потому что cmp() сначала проверяет is , идентичны ли аргументы (нет хорошего значения для возврата из этого cmp() , так как функция cmp() делает вид, что существует полный порядок для чисел с плавающей запятой, но это неверно для NaN ).
Различия в производительности.
CPython имеет оптимизацию, которая может сделать повторную конкатенацию строк неквадратичной. Например, такой код выполняется за время O(n) :
s = '' for string in mylist: s += string
В PyPy3 этот код всегда будет иметь квадратичную сложность. Также обратите внимание, что оптимизация CPython хрупкая и в любом случае может сломаться из-за небольших изменений в коде. Так что все равно необходимо заменить код выше на:
parts = [] for string in mylist: parts.append(string) s = "".join(parts)
В принципе это основные отличия с которыми сталкивается 80% разработчиков.
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Выбираем разрядность Python3 для Windows
- Установка Python3 на ОС Windows
- Установка Python3 на Ubuntu (Debian) из репозиториев
- Выбираем разрядность Python3 для Linux
- Установка Python 3.x из исходников на ОС Linux
- Запуск и использование интерпретатора Python
- Установка и использование PyPy3, совместимость с Python3
- Когда следует переходить на новую версию Python
Pypy как пользоваться
Imakf → Codeforces Round 906 (Div. 1, Div. 2)
GenGenM → Andvikpro тупой
abcsumits → Request to everyone, bully me!
whynesspower → [URGENT] Codeforces need anti-scrapping
purp4ever → Teams Qualified for Africa and Arab Collegiate Programming Championship — ACPC 2023 (+teens)
diskoteka → Codeforces Round #878 (Div.3) Разбор
tkm.algorithms → IOI 2027
Imakf → Codeforces Round 906 Editorial
atcoder_official → Panasonic Programming Contest 2023(AtCoder Beginner Contest 326) Announcement
chenjb → Rescheduling of World Finals 22&23
wittywho → CPH causing Compilation error but code runs fine on terminal
whynesspower → Reverse check the questions: ChatGPT
stdfloat → Is CF enough for IZHO, IOI?
-kirito- → Invitation to TheForces #25 (5^2-Forces, TheForces-Rated, Prizes!)
I_lOVE_ROMAN → Time Complexity Calculation
127.0.0.1 → Codeforces Round 907 (Div. 2)
flamestorm → Codeforces Round 871 (Div. 4) Editorial
-arma- → SQRT decomposition for beginners
neo_30 → Maximum deletions in a string
arpit_aditya → Cherry Pickup Leetcode 741 — Why is this approach giving wrong Answer?
_Firdavs_Aminov_ → Dark theme Codeforces
elshiko → Квалификационный раунд Yandex Cup 2023
MercilesslyMan → Vim for competitive programming
AquaMoon → Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Editorial
74TrAkToR → Codeforces Round #904 (Div. 2) Editorial
Блог пользователя MikeMirzayanov
Встречайте PyPy на Codeforces
Автор MikeMirzayanov, 9 лет назад ,
Рад представить вам PyPy на Codeforces. Прошу любить и жаловать.
Хорошие новости состоят в том, что JIT в самом деле работает — PyPy зачастую оказывается существенно быстрее классического Python. Похоже, что обычно PyPy быстрее в 2-60 раз. Например, PyPy 2 показывает 60 кратный прирост производительности на binary-heap-benchmark, а PyPy 3 — 85-ти кратный.
Кроме того у PyPy хорошая совместимость с Python, то есть в большинстве случаев вы можете просто отправить программу на PyPy.
Не уходите далеко — скоро вас ждут еще хорошие новости 🙂
python, pypy, codeforces
Комментарии (40)
9 лет назад , # |
← Rev. 4 → +37
ЧЯДНТ? 🙁
код — абсолютно одинаковый 🙁
UPD: благодаря комментарию hellman_, я, поменяв input() на sys.stdin.readline() и print() на sys.stdout.write(), добился едва ли не такой же скорости, как и у питона
теперь обе задачи по 108-109 мс, что уже «погрешность»
9 лет назад , # ^ |
А что тут удивительного?
9 лет назад , # ^ |
← Rev. 2 → +5
Выбери более насосную задачу — там поглядим. На миллисекундах статическая погрешность большая, например на разогрев jit должно время уйти. %)
9 лет назад , # ^ |
так-то оно так, просто я python использую как раз для таких задач див2 А-С из-за скорости тайпинга
хотелось его использовать без какой-либо боязни получить ТЛ на таких задачах, а получается, что выигрыш получается «наоборот» на сложных и долгих задачах
а так, я не мастер питона и знаю его как пару клевых фич/немного синтаксического сахара, чтобы писать на нем более сложные задачи. Наверняка кто-нибудь напишет что-то существенное и там будет значительный прирост в скорости
9 лет назад , # ^ |
для таких задач див2 А-С из-за скорости тайпинга
ну да, я его для того же юзал помнится — по сравнению с толстой джавой это выглядело оч экономно 🙂
а получается, что выигрыш получается «наоборот» на сложных и долгих задачах
которые вообще м.б. уже можно и не на питоне писать 🙂 Я всецело согласен — мне вообще сомнительно что от PyPy будет много проку для спортивных задач с ограничением в 1-2 секунды. В общем кажется в этот раз команда CF проделала хорошую, но вероятно, невостребованную работу. 🙁
9 лет назад , # ^ |
← Rev. 3 → +44
Или даже так
9 лет назад , # ^ |
pypy — это же JIT (динамический компилятор), поэтому так и должно быть. Опережать он должен на более длительных временах выполнения.
9 лет назад , # ^ |
Pypy иногда работает медленней сpython, мы наблюдали случаи, когда pypy был в два раза медленнее, чем cpython. Но это редкие случаи, как правило, все-таки pypy быстрее. По-видимому, трудно предсказать, в какому случае будет быстрее pypy, а в каком — сpython. Для этого нужно как минимум очень хорошо понимать, как устроен каждый из них.
9 лет назад , # |
Три сабмита, второй и третий с ручными оптимизациями.
По поводу pypy3 — разработка ведется не так давно, у разрабов основной задачей была совместимость с py3 и я думаю они пока не сильно работали над производительностью.
9 лет назад , # ^ |
← Rev. 2 → 0
А вот здесь >2с (не проходит) vs 0.404с: Ещё пример, алгоритм ~2.5kk операций:
PS. Почему то в попытках в моем профиле неверная ссылка на задачу.
9 лет назад , # ^ |
Хм у pypy почему то raw_input() / print медленные. Нужно sys.stdin/stdout юзать..
9 лет назад , # ^ |
Хм у pypy почему то raw_input() / print медленные
потому что в PyPy эти функции — просто обертки над sys.stdin/stdout с кучей рефлекшна и обработки исключений. В обычном CPython такой проблемы нет, потому что они написаны на C.
9 лет назад , # |
← Rev. 2 → -37
добавьте JIT для C++ 🙂 в MSVC он уже есть
9 лет назад , # ^ |
9 лет назад , # ^ |
← Rev. 2 → 0
хапчо. /clr:pure http://codeforces.com/blog/entry/14083
9 лет назад , # ^ |
← Rev. 3 → +5
Это имхо не для «вообще C++» это для CLR от .NET — не важно на каком языке ты под неё пишешь. В чём смысл (для спортивных задач) писать на C++ под .NET, чтобы получилось нарочно медленнее а потом кое-как оптимизировалось JIT-ом — я не представляю.
9 лет назад , # ^ |
Какая хрен разница, достаточно большое подмножество (если не всё) Си++ там работает, а через что оно уже работает, уже отдельная тема. Ты хотя бы прочитал ссылку? Я привёл пример, в котором JIT быстрее едва ли не в полтора раза. И ты, похоже, не понимаешь причины того, почему C#/Java медленее С++. Дело не столько в JIT, а другой семантике языка (там нет UB и вс ё выполняется строго слева направо) и неотключаемых проверках индексов при обращении к массиву (а если это массив ссылок, то требуется еще проверка типа объекта)
9 лет назад , # ^ |
← Rev. 4 → +5
И вовсе он не быстрее. Мне лень перезагружаться в Windows на своей машине, поэтому я прогнал (несколько раз! один раз ничего не говорит) на соседней XP с VS2010, и нативная версия работает за 7000 тиков, а CLI — за 10000 тиков. И совершенно нет причин, по которым JIT был бы быстрее на таком коде.
Дело не столько в JIT, а другой семантике языка (там нет UB и вс ё выполняется строго слева направо) и неотключаемых проверках индексов при обращении к массиву
Вообще я согласен, но хочу заметить, что JIT на это наплевать и он всех оптимизирует одинаково, а проверки индексов, бывает, наоборот, помогают сделать циклы быстрее (когда они выносятся за цикл, а внутри производится оптимизация с учётом того, что индекс точно находится внутри границ — в частности, что индекс неотрицателен и не переполняется при прибавлении шага цикла).
(а если это массив ссылок, то требуется еще проверка типа объекта)
Совсем даже не требуется. Массивы разных типов — это разные типы; и в CLI, и в JVM. И для generic collections в CLI тоже не требуется; а вот в Джаве — да, вот там требуется. Не говоря уже о том, что не важно, C# это или C++/CLI, а массивы ссылок работают абсолютно одинаково. [Edit для читателя: Нет, всё-таки требуется при записи в массив, см. ниже.]
9 лет назад , # ^ |
← Rev. 3 → 0
CLR JIT will inline one level of recursion, MSVC 8 SP1 will not without #pragma inline_recursion(on)
(Вроде датировано 2010 г. и версия MSVC даже меньше, чем я использовал, так что не знаю, почему у меня этого не произошло. Или, может быть, произошло, но CLI-версия всё равно медленнее?) Ну ок. Да. JIT может так сделать. С такой же лёгкостью AOT может так сделать! MSVC этого не делает по умолчанию. Зря. Но это же не повод кричать, что JIT лучше в общем случае. Не говоря уже о том, что помогает это не шибко-то часто. Вон, как я говорю, проверка индексов тоже бывает, что ускоряет, — это же не повод кричать, что с проверкой индексов всё получается быстрее, чем без неё.
9 лет назад , # ^ |
← Rev. 3 → -14
Вообще я согласен, но хочу заметить, что JIT на это наплевать и он всех оптимизирует одинаково
Если писать на C++/CLI pure и C#/unsafe то результаты будут похожие, но, простите, когда речь заходит о скорости нормального с# кода, а не unsafe.
Совсем даже не требуется. Массивы разных типов — это разные типы;
Требуется. Допустим есть класс «фрукт» и класс «яблоко» и есть метод, принимающий массив фруктов и что-то с ним делающий. Так вот, Java позволяет передать в этот метод массив яблок (потому что каждое яблоко является фруктом) — но там поэтому стоят рантайм проверки, чтобы никто в массив, аллоцированный как массив яблок, и имеющий формальный тип массив фруктов, не положил грушу. В общем, иди почитай про трансляторы, а не неси чушь с апломбом.
Object[] objects = new Integer[10]; objects[0] = "Hello World"; // run-time check!
Как использовать PyPy в качестве интерпретатора в PyCharm и устанавливать в него библиотеки?
В частности, мне нужна библиотека PyGame(он её поддерживает, как говорится в описании).
Проблема собстн в том, что я могу добавить PyPy в PyCharm в качестве интерпретатора, но не могу установить в него НИ ОДИН пакет через pip или любым другим способом!
Кто-нибудь имеет опыт с подобными плясками с бубнами? Можете помочь?
- Вопрос задан более года назад
- 1158 просмотров
Комментировать
Решения вопроса 1
michadimin @michadimin Автор вопроса
В общем, было легче накатить линукс и сделать всё из терминала. Я даже к гайдам не прибегал, когда там это всё устанавливал!
1. Установил Ubuntu
2. Обновил glibc и остальные важные компоненты
3. Прописал в терминал: sudo apt install pypy3
4. Скачал скрипт для установки pip
5. Запустил этот крипт из под pypy
6. Готово! PyPy3 способен полноценно работать!
Ответ написан более года назад
Комментировать
Нравится Комментировать
Ответы на вопрос 1
распаковуешь PyPy для своей ОС
создаешь новый проект в качестве интерпритатора выбираешь PyPy
в терминале пайчарма выполняешь pypy -m ensurepip
Ответ написан более года назад
michadimin @michadimin Автор вопроса
Оно не работает так.
Выдаёт ошибку при установке PyGame. Где-то вычитал, что проблема может быть из-за отсутствия установленной Visual Studio 14, да только вот где его блин взять, если майкрософт нигде не позволяет скачать старые версии?
michadimin, ставил vs14 буквально в том месяце, никаких проблем не испытал.
michadimin, пробовал например что-нибудь такое?
https://stackoverflow.com/questions/48541801/micro.
michadimin @michadimin Автор вопроса
mkone112, дай ссылку. Я нигде не нашёл, где это скачать.
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- PyCharm
Как писать в пайчарм?
- 1 подписчик
- 25 окт.
- 58 просмотров
- PyCharm
Ошибка при установке пакета psycopg2?
- 1 подписчик
- 13 окт.
- 40 просмотров
- PyCharm
Как найти команду?
- 1 подписчик
- 28 сент.
- 84 просмотра
- Git
- +1 ещё
Как исправить «The repository is in the detached HEAD state» без консоли?
- 1 подписчик
- 21 сент.
- 78 просмотров