Швидкі аналоги популярних бібліотек для Python

Так вийшло, що кілька місяців я намагався серйозно використовувати в якості сервера, залізницю на 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 або ігнорує яких немає в його списку (який жорстко забитий в лібі). Для редагування деяких помилок ми застосували MonkcePatching (на жаль).

GZIP

Не можна використовувати максимальні значення, а краще крутитися навколо коефіцієнта 5. Нижче вже на швидкість починає сильно впливати розмір, а вище вже сильно уповільнює формування контенту на віддачу. Знайти для gzip аналог важко (і легко підмінити в системі) але є порада - використовувати його тільки на боці nginx і не намагатися з python. В одному з тестових проектів, я використовував gzip стиснення як middleware в python і перенесення його в nginx дозволило скоротити навантаження.

Frameworks

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

Як то так.

Продовження історії з чатом тут: habrahabr.ru/post/228703.

ЗИ в тексті багато жаргонізмів, вибачте але мені так приємніше писати.

ЗЫ2 помилок швидше за все так само багато, пишіть в особистість якщо знайдете.