Как PyPy ускоряет Python до уровня C?

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

Однако стоит обсудить существенный недостаток: выполнение кода на стандартном интерпретаторе Python потребует больше времени, чем компилируемые языки, такие как C или C++. И что же делать, когда идея проверена, прототип успешно реализован на Python, и хочется наконец-то превратить его в готовый, быстрый, производительный инструмент? Популярное решение — проделать двойную работу, вручную преобразовывая Python-код в код на C. Но разве не было бы здорово, если бы прототип смог работать достаточно быстро на Python? Все время, потраченное на двойную реализацию, можно было бы направить на создание чего-то более значимого и интересного.

К счастью, существует PyPy — быстрая альтернатива стандартному интерпретатору Python.

Чтобы проиллюстрировать, насколько PyPy способен ускорить выполнение кода, можно запустить стандартный интерпретатор Python вместе с PyPy:

import time
from termcolor import colored

start = time.time()
number = 0
for i in range(100000000):
    number += i
    
print(colored("ЗАВЕРШЕНО", "зеленый"))
print(f"Время выполнения: {time.time() - start} сек")

Скрипт складывает все целые числа от 0 до 100 000 000 в цикле и после завершения работы выводит на экран сообщение с временем выполнения.

Хотя иллюстрирующий пример нельзя назвать научной оценкой, его результат все равно поражает. По сравнению со стандартным интерпретатором Python, которому требуется около 10 секунд, PyPy завершает выполнение примерно через 0,22 секунды! Также обратите внимание, что свой Python-код можно запустить с помощью PyPy без каких-либо изменений. Результат становится еще более впечатляющим, если сравнить его с языком программирования C, ведь эквивалентная реализация на C выполняется 0,32 секунды. Получается, что в некоторых случаях PyPy может превзойти C по скорости выполнения!

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

Почему PyPy так быстро выполняет код?

Секрет увеличения производительности PyPy заключается в компиляции “точно в срок” (just-in-time), сокращенно JIT-компиляция.

Рассмотрим компиляцию подробнее.

Опережающая Компиляция (Ahead-Of-Time Compilation)

Такие языки программирования, как C, C++, Swift, Haskell, Rust и многие другие, компилируются заранее — они компилируемые. Это означает, что после написания кода вы нажимаете кнопку, и компилятор преобразует исходный код в машиночитаемый код, адаптированный под одну конкретную архитектуру компьютера: для выполнения программы исходный код больше не потребуется.

Опережающая компиляция конвертирует ваш исходный код в машинный код

Интерпретация Языка

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

Интерпретатор выполняет программу построчно.

В случае с JavaScript интерпретатор встроен в каждый веб-браузер, а интерпретатор Python необходимо устанавливать отдельно. Стандартный интерпретатор Python с веб-сайта python.org называется CPython. Однако важно различать Python как язык и CPython как программу-интерпретатор, которая выполняет код на языке Python. Это связано с тем, что существуют совершенно разные инструменты для выполнения кода, написанного на Python. Именно здесь в дело вступает PyPy.

Компиляция точно в срок (Just-In-Time Compilation)

PyPy — это альтернативная реализация Python, использующая компиляцию “точно в срок”. Принцип работы таков: PyPy запускается как интерпретатор, выполняющий код Python напрямую из исходных файлов. Однако вместо того, чтобы выполнять код построчно, PyPy компилирует части кода в машинный код непосредственно перед его выполнением, так сказать, вовремя.

JIT-компиляция сочетает опережающую компиляцию и интерпретацию.

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

Так в чем же польза PyPy?

Теперь, когда стало понятно, как же PyPy достигает своего поразительного прироста производительности, хочется сразу использовать его. PyPy доступен на сайте pypy.org и легко устанавливается. Помимо самого инструмента, на сайте можно ознакомиться со множеством советов и рекомендаций по тонкой настройке Python-программы для еще большего увеличения производительности. Поскольку PyPy — это альтернативная реализация интерпретатора Python, то в большинстве случаев он просто работает “из коробки” без каких-либо изменений вашего проекта. Он полностью совместим с веб-фреймворком Django, пакетом для научных вычислений Numpy и множеством других пакетов. PyPy сэкономит вам бесчисленное количество часов, позволяя не переписывать свои программы на Python ради скорости выполнения, и его уж точно нельзя упустить из своего набора инструментов для разработки программного обеспечения.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Marcel Moosbrugger: Run Your Python Code as Fast as C

Предыдущая статьяСоздание архитектур кода с помощью функциональных операторов
Следующая статьяПриложения искусственного интеллекта: возможности и сферы применения