Конечно, все зависит от определенных нюансов, но как именно, и как понять, какая версия Python будет самой быстрой для вашего приложения?
Является ли Python 3 медленнее Python 2? Какая версия Python 3 – самая быстрая? Какие существуют другие варианты для повышения скорости?
Использование служебной программы производительности
Главная команда Python делает многое для производительности, стоит упомянуть сайт speed.python.org, который является отличным примером с «официальными» показателями тестов CPython.
Однако существует несколько проблем:
1. Результаты достаточно сложно прочитать;
2. Они не включают в себя PyPy;
Вместо этого, вы можете скачать панель инструментов, которая запускает этот сайт при помощи команды pip install performance, после чего вы можете запустить:
pyperformance run --python={chosen_python_runtime} -o my_results.json
Таким образом, несколько раз запустятся серии документированных «реальных» приложений с целевой версией Python с записью средних и медиан.
Это отлично подходит в контексте данной статьи для официальных инсталляций Python:
- 2.7.10,
- 3.4.4,
- 3.5.4,
- 3.6.1, а также
- 3.7 (у нас имеется бета 2).
Кроме этого, это включает PyPy(5.6.) и PyPy3 (5.4.10).
Результаты
Я подправил результаты, указанные ниже в соответствии с нашим случаем. Взгляните, проведите свой собственный тест и по возможности, напишите собственный тест.
Я также создал простой скрипт для получения списка файлов данных производительности и создания графиков для каждого теста. Код на GitHub.
Лучшими результатами производительности в графиках являются секундой или еще быстрее
Полные результаты с графиками доступны здесь:
https://github.com/tonybaloney/performance_testing/tree/master/png
Я выложил тесты из соображений их значимости. Остальные тесты, которые будут показаны, находятся в подведении итогов, и имеют схожие паттерны.
Рендеринг результатов в HTML
Тест django_html использует шаблон движка рендеринга Django для создания таблицы HTML 150 х 150. Он использует классы Content и Template движка Django.
Python 3.7 на 1.19x быстрее Python 2.7, но это единственный релиз Python 3.x, который опередил Python 2.7, который я запустил.
PyPy опережает все результаты CPython, однако PyPy3 в два раза медленнее PyPy. Стоит отметить недавнее решение в Django, касаемо отказа поддержки Python 2 в Django 2.0 и выше. Это означает, что PyPy больше не поддерживается Django 2.
Время запуска
Данный тест просто оценивает время, необходимое интерпретатором для запуска. Если вы обходите ограничение GIL в Python, запустив несколько процессов, то это может быть важным.
Обратите внимание на скачок показателей PyPy, особенно PyPy3. Мы рассмотрим, почему так произошло в конце статьи.
Но суть в том, что показатель времени запуска Python 2.7 все еще самый лучший.
Криптография: crypto_paes
В данном тесте вы увидите любопытную разницу в скорости между Python 2 и 3. Почему? Crypto запрашивает большое количество расчетов, а Python 3 больше не поддерживает 32-разрядные типы чисел, только (очень) длинные числа.
Пользователи PyPy могут заметить, что PyPy3 почти в пять раз медленнее, чем PyPy!
Арифметика с плавающей точкой
«float» - это искусственное приложение арифметики с плавающей точкой, которое создаст 100 000 точечных объектов, которые вычисляют math.cos(), math.sin() и math.sqrt().
Это тип приложения, который идеально подходит для PyPy, большого количества расчетов чисел, предсказуемых методов, типов и циклов. Python 3.7 содержит новый быстрый метод вызова опкода, который используется в данном тесте.
Регулярные выражения
В тесте регулярных выражений, «запуск 50 самых популярных сайтов в Интернете и протоколирование всех операций с регулярными выражениями. Каждой операции присваивается значение, которое рассчитывается по оценке популярности страниц, на которой она выполняется и того, сколько раз она выполняется при загрузке каждой страницы. Наконец, буквы данных кодируются при помощи ROT13 таким образом, чтобы не повлиять на то, как регулярные выражения соотносят их при вводе».
Трудно сказать, что происходит с PyPy в данном графике. Было бы любопытно, если бы кто-нибудь прислал мне такой же результат!
Обновление: команда PyPy увидела оригинал статьи и внесла правки.
Значит, Python 3 быстрее, чем Python 2?
Именно! Практически в каждом тесте. Исключения есть только в тесте crypto_paes, где Python 3 был на 1.35 медленнее (из-за типов чисел) и в тесте python_startup медленнее на 1.39.
Медленный запуск Python 3 – это главная проблема, над которой работает основная команда CPython в версиях 3.8 и 3.9.
Помимо этих двух тестов, Python 3 в 1.2–1.3 раза быстрее по своим показателям в остальных тестах. Вы можете заметить улучшения, обновившись до Python 3.7, когда он появится на полках в этом году.
Почему PyPy такой быстрый и почему им не пользуются все?
PyPy быстрее CPython благодаря своему компилятору just-in-time. Компиляторы JIT имеют огромное преимущество, так как являются крайне эффективными при выполнении предсказуемых и повторяющихся задач. Суть наших контрольных показателей включает в себя запуск одних и тех же кусков кода несколько раз подряд для точности, ускорения приложения и снижения появлений ошибок. Здесь PyPy блистает в каждом таком тесте.
Недостаток JIT компилятора и PyPy в целом – это цена запуска. Другой недостаток – это слабая совместимость с С-расширениями. Так как Python (CPython, официальный PSF Python) написан на С, многие сторонние расширения PyPi используют этот язык. Хороший пример – Numpy, так как большая его часть написана на оптимизированном коде С. При установке numpy при помощи pip, он использует ваш локальный компилятор С и строит бинарную библиотеку для вашей среды Python для выполнения.
Так как PyPy написан на Python, множество модулей не может работать с PyPy. Так что будьте бдительны и всегда проверяйте.
Кроме этого, PyPy переживает те же проблемы, что и CPython – переход версии языка 2 на версию 3. PyPy3 до недавних пор был достаточно нестабильным, что можно заметить по контрольным показателям, где присутствуют странные несоответствия с PyPy. Также были замечены проблемы с пакетами (PyTest), отбрасывающими поддержку PyPy3, хотя эту проблему пытаются уладить.
Подведем итоги
Python 3.7 – самая быстрая официальная версия Python, при этом PyPy демонстрирует самую быструю производительность (по крайней мере, в рамках наших тестов).
Хотелось бы в будущем увидеть производительность PyPy3 даже выше, чем это делает PyPy, так как версия Python 2 используется все реже и реже.