Введение
В первой части работы [1] предложена методология сравнения интерпретаторов Python – CPython, PyPy и GraalPy – учитывающая их архитектурные различия. Разработан набор бенчмарков для численных и текстовых задач и формализован протокол сбора метрик.
Настоящая работа представляет результаты применения методологии. Цель – оценить производительность интерпретаторов и сформулировать рекомендации по их выбору. Для этого измерены время выполнения и пиковое потребление памяти, проанализированы данные, выявлены сценарии наилучшей производительности и сформулированы критерии выбора.
Эффективность интерпретаторов в задачах интенсивных численных вычислений
Эксперимент показал, что PyPy и GraalPy значительно превосходят CPython в циклических численных операциях благодаря JIT-компиляции, которая «происходит на стороне интерпретатора, что позволяет улучшить производительность приложений, особенно в случае использования больших объемов данных» [2, с. 12]. Динамическая компиляция горячих участков в машинный код сокращает накладные расходы на интерпретацию, особенно на длительных итерациях. Однако при неоднородных данных и частых ветвлениях выигрыш от JIT снижается, так как адаптивная оптимизация не успевает скомпилировать все участки, сближая результаты с CPython.
С использованием NumPy различия между интерпретаторами нивелируются, поскольку вычисления делегируются низкоуровневым реализациям на C и Fortran, выполняющимся вне интерпретатора, что делает JIT-компиляцию нерелевантной.
Анализ скорости обработки текстовых данных и регулярных выражений
Эксперимент показал, что PyPy значительно ускоряет операции с регулярными выражениями – до трёх раз быстрее, чем CPython, благодаря оптимизации шаблонов с использованием JIT-компиляции. CPython демонстрирует стабильные, но более низкие результаты. GraalPy немного превосходит CPython при обработке коротких строк благодаря эффективной компиляции, но на длинных шаблонах его преимущества могут снижаться из-за накладных расходов на JIT. При работе с большими текстовыми файлами GraalPy выигрывает до 50% времени выполнения по сравнению с CPython, особенно при стабильной загрузке процессора. PyPy также показывает ускорение, но уступает GraalPy из-за менее агрессивной оптимизации памяти и кэширования.
Оценка потребления оперативной памяти и накладных расходов JIT-компиляции
Анализ потребления ресурсов на этапе холодного запуска выявляет существенные различия между интерпретаторами. GraalPy требует до 200 МБ оперативной памяти при инициализации JIT-компилятора против 50 МБ у CPython, что обусловлено загрузкой сложной инфраструктуры GraalVM. Это делает GraalPy менее пригодным для короткоживущих скриптов, где время инициализации критически влияет на общую производительность.
PyPy занимает промежуточное положение: при долгосрочном выполнении его сборщик мусора обеспечивает более предсказуемое освобождение ресурсов, чем у GraalPy, что позволяет эффективно управлять памятью в задачах непрерывной обработки данных. Выбор интерпретатора должен основываться на балансе между пиковой скоростью выполнения и доступным объемом оперативной памяти.
Критерии и ограничения при выборе интерпретатора
Эффективность JIT-компиляции в PyPy и GraalPy зависит от характера приложения. Для длительных численных циклов выгода превышает затраты на разогрев, но для короткоживущих скриптов время компиляции может превышать время выполнения, делая JIT-интерпретаторы нецелесообразными. В задачах обработки текста преимущества JIT нивелируются, и CPython остаётся конкурентоспособным благодаря зрелости и экосистеме с оптимизированными C-расширениями.
PyPy и GraalPy ограничены неполной поддержкой C-API, что затрудняет использование популярных библиотек. GraalPy перспективен для многопоточных сред и интеграции с Java, но проблемы совместимости и потребления памяти остаются актуальными. Выбор интерпретатора должен основываться на анализе нагрузки и необходимости сторонних библиотек.
Сводные данные приведены в таблице.
Таблица
Сравнительная характеристика интерпретаторов Python
Критерий | CPython | PyPy | GraalPy |
Архитектура | Интерпретатор байт-кода | Трассирующий JIT-компилятор | JIT-компиляция на базе GraalVM |
Относительная скорость (численные циклы) | 1× (эталон) | До 20× быстрее | До 40× быстрее |
Потребление памяти (холодный старт) | ~50 МБ | Промежуточное | До 200 МБ |
Поддержка C-API / NumPy | Полная | Ограниченная | Ограниченная |
Время "разогрева" JIT | Отсутствует | Требуется | Требуется |
Многопоточность | Ограничена GIL | Ограничена GIL | Потенциально эффективна |
Рекомендуемые сценарии | Универсальный, текстовые задачи, NumPy/Pandas | Длительные численные циклы | Высоконагруженные системы, интеграция с Java |
Заключение
Исследование подтвердило зависимость производительности интерпретаторов от типа нагрузки. На численных задачах PyPy и GraalPy значительно быстрее CPython, но при использовании NumPy различия исчезают. На текстовых задачах преимущество альтернативных интерпретаторов менее выражено.
Анализ памяти выявил ограничение GraalPy – до 200 МБ при инициализации, что делает его менее пригодным для короткоживущих скриптов. PyPy занимает промежуточную позицию.
Рекомендации: для численных расчётов – PyPy или GraalPy; для текстовых задач – CPython; для универсальных приложений – PyPy. GraalPy ограничен потреблением памяти и совместимостью с C-API.

