What is pypy python

PyPy — Features

PyPy is a replacement for CPython. It is built using the RPython language that was co-developed with it. The main reason to use it instead of CPython is speed: it runs generally faster (see next section).

PyPy implements Python 2.7.18, 3.9.15, and 3.8.15. It supports all of the core language. It supports most of the commonly used Python standard library modules. For known differences with CPython, see our compatibility page.

The following CPU architectures are supported and maintained:

  • x86 (IA-32) and x86_64
  • ARM platforms (ARMv6 or ARMv7, with VFPv3, and Apple Silicon arm64)
  • AArch64
  • PowerPC 64bit both little and big endian
  • System Z (s390x)

PyPy’s x86 version runs on several operating systems, such as Linux (32/64 bits), MacOS (64 bits), Windows (32 bits), OpenBSD, FreeBSD. Non-x86 versions are supported on Linux, and ARM64 is supported on MacOS.

If you are interested in helping, see our howtohelp page.

The main features of PyPy:¶

Speed¶

Our main executable comes with a Just-in-Time compiler. It is really fast in running most benchmarks—including very large and complicated Python applications, not just 10-liners.

There are two cases that you should be aware where PyPy will not be able to speed up your code:

  • Short-running processes: if it doesn’t run for at least a few seconds, then the JIT compiler won’t have enough time to warm up.
  • If all the time is spent in run-time libraries (i.e. in C functions), and not actually running Python code, the JIT compiler will not help.
Читайте также:  Трансляции футбольных матчей html

So the case where PyPy works best is when executing long-running programs where a significant fraction of the time is spent executing Python code. This is the case covered by the majority of our benchmarks, but not all of them — the goal of PyPy is to get speed but still support (ideally) any Python program.

Memory usage¶

Memory-hungry Python programs (several hundreds of MBs or more) might end up taking less space than they do in CPython. It is not always the case, though, as it depends on a lot of details. Also note that the baseline is higher than CPython’s.

Stackless¶

Support for Stackless and greenlets are now integrated in the normal PyPy. More detailed information is available here.

Other features¶

PyPy has many secondary features and semi-independent projects. We will mention here:

  • Other languages: we also implemented other languages that makes use of our RPython toolchain: Prolog (almost complete), as well as Smalltalk, JavaScript, Io, Scheme and Gameboy. There is also a Ruby implementation called Topaz and a PHP implementation called HippyVM.

Sandboxing¶

PyPy’s sandboxing is a working prototype for the idea of running untrusted user programs. Unlike other sandboxing approaches for Python, PyPy’s does not try to limit language features considered «unsafe». Instead we replace all calls to external libraries (C or platform) with a stub that communicates with an external process handling the policy.

Please be aware that it is a prototype only. It needs work to become more complete, and you are welcome to help. In particular, almost none of the extension modules work (not even time ), and pypy_interact is merely a demo. Also, a more complete system would include a way to do the same as pypy_interact from other languages than Python, to embed a sandboxed interpreter inside programs written in other languages.

To run the sandboxed process, you need to get the full sources and build pypy-sandbox from it (see Building from source). These instructions give you a pypy-c that you should rename to pypy-sandbox to avoid future confusion. Then run:

cd pypy/sandbox pypy_interact.py path/to/pypy-sandbox # don't confuse it with pypy/goal/pyinteractive.py! 

You get a fully sandboxed interpreter, in its own filesystem hierarchy (try os.listdir(‘/’) ). For example, you would run an untrusted script as follows:

mkdir virtualtmp cp untrusted.py virtualtmp/ pypy_interact.py --tmp=virtualtmp pypy-sandbox /tmp/untrusted.py

Note that the path /tmp/untrusted.py is a path inside the sandboxed filesystem. You don’t have to put untrusted.py in the real /tmp directory at all.

To read more about its features, try pypy_interact.py —help or go to our documentation site.

Источник

What is PyPy?¶

Historically, PyPy has been used to mean two things. The first is the RPython translation toolchain for generating interpreters for dynamic programming languages. And the second is one particular implementation of Python produced with it. Because RPython uses the same syntax as Python, this generated version became known as Python interpreter written in Python. It is designed to be flexible and easy to experiment with.

To make it more clear, we start with source code written in RPython, apply the RPython translation toolchain, and end up with PyPy as a binary executable. This executable is the Python interpreter.

Double usage has proven to be confusing, so we’ve moved away from using the word PyPy to mean both toolchain and generated interpreter. Now we use word PyPy to refer to the Python implementation, and explicitly mention RPython translation toolchain when we mean the framework.

Some older documents, presentations, papers and videos will still have the old usage. You are hereby warned.

We target a large variety of platforms, small and large, by providing a compiler toolsuite that can produce custom Python versions. Platform, memory and threading models, as well as the JIT compiler itself, are aspects of the translation process — as opposed to encoding low level details into the language implementation itself.

For more details, have a look at our architecture overview .

© Copyright 2023, The PyPy Project.

Источник

Установка

Ваша ОС из коробки должна предоставлять пакет PyPy. На macOS, например, он инсталлируется с помощью Homebrew :

🐍 PyPy: ускоряем Python с минимальными усилиями

Чтобы увидеть PyPy в действии, создайте файл Python с именем script.py и поместите в него следующий код:

🐍 PyPy: ускоряем Python с минимальными усилиями

Исторически сложилось так, что PyPy связан с двумя сущностями:

  • Языковым фреймворком RPython для создания интерпретаторов динамических языков;
  • Реализацией Python с использованием этого фреймворка.

Причина, по которой PyPy известен, как написанный на Python (а не на RPython) интерпретатор, заключается в следующем: RPython использует тот же синтаксис, что и Python. Давайте разберемся, как разрабатывается PyPy:

  • Исходный код написан на RPython;
  • Инструменты RPython (translation toolchain) применяются к коду, делая его более эффективным. Они компилируют код в машинный, поэтому под Mac, Windows и Linux необходимы разные версии;
  • Создается двоичный исполняемый файл – интерпретатор Python, который мы использовали для запуска скрипта.

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

Далее мы изучим функции, делающие PyPy таким эффективным.

Just-In-Time (JIT) компилятор

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

Компилируемые ЯП более производительны, но их сложно портировать на различные архитектуры и ОС. Интерпретируемые ЯП лучше портируются, но их производительность намного хуже.

Существуют языки, вроде Python, которые сочетают в себе оба свойства: исходный текст сначала компилируется в промежуточный байт-код, а потом интерпретируется CPython. Это позволяет софту работать стабильнее и сохраняет преимущество портируемости.

Однако производительность по-прежнему далека от компилируемой версии, поскольку та способна выполнять множество невозможных для байт-кода оптимизаций. Здесь появляется JIT -компилятор, объединяющий лучшие части обоих миров. Рассмотрим шаги JIT-компиляции, необходимые для обеспечения производительности:

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

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

Сборщик мусора

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

В C и C++ проблему обычно приходится решать вручную. Другие языки программирования, вроде Python и Java, делают это автоматически. Процесс называется автоматической сборкой мусора – существует несколько методов ее выполнения.

В CPython счетчик ссылок на объект увеличивается всякий раз, когда на него ссылаются и уменьшается при разыменовании. Когда счетчик равен нулю, CPython автоматически вызывает функцию освобождения памяти для объекта, но есть один нюанс. Когда количество ссылок большого дерева объектов становится равным нулю, все связанные объекты освобождаются. Возможна длинная пауза, во время которой программа простаивает. Есть также вариант, при котором подсчет ссылок не сработает. Рассмотрим следующий код:

class A(object): pass a = A() a.some_property = a del a 

В приведенном коде определяется новый класс, создается экземпляр, его свойству присваивается ссылка на себя, а экземпляр удаляется.

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

В этом случае CPython использует другой инструмент – циклический сборщик мусора. Он пробегает по всем объектам в памяти, идентифицирует доступные и освобождает недостижимые, поскольку они больше не активны. Это исправляет проблему с циклом ссылок, однако могут появиться заметные паузы, когда в памяти находится большое количество объектов.

PyPy использует только второй метод. Он периодически ходит по «живым» объектам, начиная с корня. Это дает ему преимущество перед CPython, делая меньше затраченное на управление памятью время. Вместо того, чтобы делать все за один подход, PyPy разбивает работу на части. Такой подход добавляет всего несколько миллисекунд после каждой коллекции, а не сотни, как в CPython.

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

Ограничения PyPy

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

Некорректная работа с C-Extensions

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

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

Разработчики трудятся над C-Extensions: некоторые пакеты уже портированы на PyPy и работают так же быстро.

Работает только с Long-Running программами

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

Чтобы в этом убедиться, выполните следующий небольшой скрипт в CPython и PyPy:

import time start_time = time.time() for i in range(100): print(i) end_time = time.time() print(f"It took seconds to compute") 

Есть небольшая задержка, когда вы запускаете его с помощью PyPy, в то время как в CPython старт происходит мгновенно. На MacBook Pro использование CPython займет 0.0004873276 секунды, а в случае с PyPy – 0.0019447803 секунды.

Он не делает компиляцию заранее

PyPy не является полностью компилируемой реализацией Python. Из-за присущего Python динамизма, код невозможно скомпилировать в двоичный файл и повторно его использовать.

PyPy – это рантайм-интерпретатор, который работает быстрее, чем полностью интерпретируемый язык, но медленнее, чем полностью компилируемый.

Заключение

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

Источники

Источник

Оцените статью