August 9, 2013

Python. Сравнение JSON, Pickle и MessagePack для сериализации коллекций.

Сегодня возникла необходимость сохранять коллекции из Python в одной колонке в БД Cassandra. Например простой list со строками. В Pycassa для этого есть возможность создать свой тип данных и довольно легко. Встал вопрос в каком виде сохранять эти объекты.

В Python-е есть стандартный модуль `pickle` для сериализации инстансов любых классов. Кроме того JSON повсюду. Недолго погуглив нашел еще такой проектик как MessagePack который рекламируется как более быстрая и более компактная замена JSON.  Если бы в этом виде нужно было отдавать куда-то наружу то здесь выиграл бы JSON. Но поскольку эта сериализация необходима только в целях хранения в БД то единственное на что нужно посмотреть и сравнить это производительность. 

Для этого создал небольшой тестовый скриптик. Результаты немного удивили.

Результаты работы с листом [1,2,3].

Сериализация Десериализация
pickle 16.3982307911 23.4636600018
json 5.60128283501 4.25825190544
msgpack 1.29555702209 0.362143039703

Еще пробовал лист строк ['1','2','3'] и тапл строк ('1','2','3').  Результаты для MessagePack и JSON оказались примерно такими же, а вот pickle повел себя еще хуже (добавилось 5-7 секунд).

В моем случае выбор очевиден — MessagePack. 

Стоит заметить что pickle может сериализовать любые объекты питона в то время когда json и MessagePack только примитивные типы. Видимо это причина его медленной работы.

No comments:

Post a Comment