python

Быстрые аналоги популярных библиотек для Python

  • суббота, 5 июля 2014 г. в 03:10:42
http://habrahabr.ru/post/228707/

Так получилось, что несколько месяцев я пытался серьёзно использовать в качестве сервера, железку на ARM процессоре.
Об этом я писал тут и тут.
Производительности мне часто не хватало, и я находил и искал различные альтернативы, часто активно использующие C/C++. Парочка библиотек под катом.


Заранее прошу прощения если все уже знают об этом но я вот только недавно раскопал эти либы.

JSON


Вот куда сейчас без него? Для веб приложений это по сути основной формат. Сервер должен уметь быстро преобразовывать python структуры в JSON и отдавать браузерам или устройствам. Наверное большинство делают import json и у них всё замечательно…
А вот если надо в разы быстрее тогда встречайте ujson. Порядки ускорения можно глянуть по ссылке, но на ARM по сути использование ujson позволило сократить время запроса с нескольких секунд до <1 секунды. Синтаксис ujson аналогичен обычному json хотя и отсутствуют некоторые атрибуты (к примеру у меня не вышло повесить свой обработчик для преобразования datetime). Так же ujson совместим с python3 и я ни разу не натыкался на его глюки.
Если у вас в JSON много текста не на английском языке то крайне выгодно использовать параметр ensure_ascii=False для функции dumps. Дело в том, что по умолчанию текст кодируется в JSON при помощи \u нотации что приводит к 6-8 байтам на один символ, а так можно всё отдавать чисто в utf-8, что уменьшает отдаваемый JSON в 2 или 3 раза (даже если используется gzip).
Внимание: для обычного json ensure_ascii=False приводит к серьёзной потери производительности, для ujson возможно даже улучшение производительности или незначительное ухудшение.

FeedParser


Многие наверно использовали эту библиотеку для того что бы парсить RSS, ATOM и т.д. Её производительность и раньше меня напрягала, а теперь я вообще не мог ей нормально пользоваться, так как парсиниг одной RSS мог длится минуту. На помощь мне пришёл SpeedParser, он позволил сократить время разбора RSS до нескольких секунд. В целом по синтаксису он совместим с FeedParser но поведение сильно отличается. К примеру он не видит кастомные namespace или игнорит которых нету в его списке (который жёстко забит в либе). Для правки некоторых ошибок мы применили MonkeyPatching (увы).

GZIP


Нельзя использовать максимальные значения, а лучше крутиться вокруг коэффициента 5. Ниже уже на скорость начинает сильно влиять размер, а выше уже сильно замедляет формирование контента на отдачу. Найти для gzip аналог трудно (и легко подменить в системе) но есть совет — использовать его только на стороне nginx и не пытаться из python. В одном из тестовых проектов, я использовал gzip сжатие как middleware в python и перенос его в nginx позволило сократить нагрузку.

Frameworks


Чем меньше оверхеда тем лучше. Не пытайтесь разворачивать крупные фреймворки, они работать будут но уже на паре другой человек всё встанет колом. Разница между Pylons и Tornado на пустой странице 3 раза в пользу последнего.

Как то так.
Продолжение истории с чатом тут: habrahabr.ru/post/228703/.

ЗЫ в тексте много жаргонизмов, простите но мне так приятнее писать.
ЗЫ2 ошибок скорее всего так же много, пишите в личку если найдёте.