Быстрый в изучении - мощный в программировании
Скрипт ИНВЕСТОР на Python

Попробуйте себя в качестве инвестора имея в помощники мощный алгоритм советника на Python...

Все уроки по PyQt5

PyQt5 реализован как комплект Python-модулей. Он включает в себя около 620 классов и 6000 функций и методов...

Скрипт отправки SMS через Python

Была задача отправить SMS-ки большому списку номеров телефона с уточнением цены за всю рассылку "До" ее отправки...

Простое ускорение 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.

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)