Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Простое ускорение Python-скриптов

Простое ускорение Python-скриптов

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

Лучший хостинг для ваших проектов!

Ищите быстрый, надежный и функциональный хостинг? В таком случае обратите внимание на предложения от REG.RU. Пост по ссылке содержит детальную информацию о них. Самое главное – это современный, быстрый, надежный и безопасный хостинг. К тому же цены невысокие, есть разные тарифные планы для различных задач.

Но, с большими объемами данных ситуация иная. Скрипт может выполняться и больше суток. Значит нужна оптимизация. Поэтому в этой

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

Бенчмарк будет выполнятся двумя скриптами, выполняющие ряд синтетических задач:

  • generate.py – генерирует 500 тысяч словарей с одними и теми же ключами и различными значениями, сериализует их в json, а затем пишет в файл. Вышло примерно так:
{"str_youCPQmO": "TMrjhoKpFuyZ", "int_VAuUXXmC": 5, "int_ScRduCVX": 73, "str_YfsEUEve": "IOAYDoAuZBzQ", "int_dlBzZYlO": 77, "int_lJaDHVSH": 45, "str_qzDCDxbm": "rfERFTVFZiku", "int_gblmMsBX": 57, "str_MZNfINjj": "DeDaDMjKQyzo", "str_sUQVbIyn": "tenhduEcWkof"}

{"str_youCPQmO": "OJRZDmiQxflr", "int_VAuUXXmC": 9, "int_ScRduCVX": 32, "str_YfsEUEve": "CYxuIUTWAVTH", "int_dlBzZYlO": 37, "int_lJaDHVSH": 22, "str_qzDCDxbm": "aZTizzobHBbh", "int_gblmMsBX": 63, "str_MZNfINjj": "sJElOjzNlpJZ", "str_sUQVbIyn": "WDUdOMwERjxm"}
 
  • analyze.py – считывает ранее сгенерированный файл и агрегирует их используя два метода:

o Если значение – это строка, нужно найти самый используемый символ по данному ключу

o Если значение – это числа, нужно высчитать среднее значение сигмоидной функции от каждого из них.

Для бенчамрка берем:

  • Python 2.7 без сторонних библиотек (эталонный).
  • Python 3 без сторонних библиотек.
  • Pypy.
  • Nuitka –recurse-none (компиляция лишь основных файлов).
  • Nuitka –recurse-all (компиляция всех зависимостей).
  • Numba.
  • Cython без модификации кода для статической тапизации.

Запуск numba не удался. Наверное, это не универсальное средство ускорения чего угодно.

Измерения проводились на Mackbook Pro Late 2013. Для запуска создан маленький fabric-скрипт.

В результате от скрипта к скрипту меняется прирост производительности (ничего удивительного). В то же время, можно с уверенностью сказать о победе pypy в обеих категориях, Cython тоже дает определенное ускорение, а вот nuitka тут вообще не дает результата (но тоже может использоваться, если, к примеру, есть необходимость просто в сборе воедино всех зависимостей). Интересно и то, что для агрегации python 3 оказался быстрее cynthonized-версии одного и того же скрипта. Поэтому, можно сделать вывод, что в различных случаях можно использовать pypy и Cython.