Мне нужно сохранить на диск небольшой dict
объект, ключи которого имеют тип, str
а значения - int
s, а затем восстановить его . Что-то вроде этого:
{'juanjo': 2, 'pedro':99, 'other': 333}
Какой вариант лучше и почему? Сериализовать его с помощью pickle
или с помощью simplejson
?
Я использую Python 2.6.
simplejson
, вы бы использовали встроенныйjson
модуль (у которого точно такой же интерфейс).Ответы:
Если у вас нет требований к совместимости (например, вы просто собираетесь использовать данные с Python) и двоичный формат подходит, используйте cPickle, который дает вам действительно быструю сериализацию объектов Python.
Если вам нужна совместимость или вам нужен текстовый формат для хранения ваших данных, используйте JSON (или другой подходящий формат в зависимости от ваших ограничений).
источник
cPickle
(илиpickle
) в зависимости от вашего помещения через JSON. Когда я впервые прочитал ваш ответ, я подумал, что причина могла быть в скорости, но поскольку это не так ... :)Я предпочитаю JSON рассолу для сериализации. Unpickling может запускать произвольный код, а использование
pickle
для передачи данных между программами или хранения данных между сеансами является дырой в безопасности. JSON не создает дыр в безопасности и стандартизирован, поэтому данные могут быть доступны программам на разных языках, если вам когда-либо понадобится.источник
Вы также можете найти это интересным с некоторыми диаграммами для сравнения: http://kovshenin.com/archives/pickle-vs-json-which-is-faster/
источник
pickle
бьетсяjson
вint
,str
иfloat
.Если вас в первую очередь заботят скорость и пространство, используйте cPickle, потому что cPickle быстрее, чем JSON.
Если вас больше интересует совместимость, безопасность и / или удобочитаемость, используйте JSON.
Результаты тестов, упомянутые в других ответах, были записаны в 2010 году, а обновленные тесты в 2016 году с протоколом cPickle 2 показывают:
Воспроизведите это самостоятельно с помощью этой сути , которая основана на тесте Konstantin, упомянутом в других ответах, но с использованием cPickle с протоколом 2 вместо pickle и с использованием json вместо simplejson (поскольку json быстрее, чем simplejson ), например
Результаты с python 2.7 на достойном процессоре Xeon 2015 года:
Python 3.4 с протоколом pickle 3 работает еще быстрее.
источник
JSON или рассол? Как насчет JSON и рассола! Вы можете использовать
jsonpickle
. Он прост в использовании, и файл на диске доступен для чтения, потому что это JSON.http://jsonpickle.github.com/
источник
Я попробовал несколько методов и обнаружил, что использование cPickle с установкой аргумента протокола метода дампа как:
cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)
является самым быстрым методом дампа.Вывод:
источник
Лично я обычно предпочитаю JSON, потому что данные удобочитаемы . Определенно, если вам нужно сериализовать что-то, что JSON не примет, используйте pickle.
Но для большинства хранилищ данных вам не нужно сериализовать что-либо странное, а JSON намного проще и всегда позволяет вам открыть его в текстовом редакторе и самостоятельно проверить данные.
Скорость хорошая, но для большинства наборов данных разница незначительна; В любом случае Python обычно не слишком быстр.
источник
pickle
более чем в два раза быстрее, чемjson
.100
элементов в списке человеческому глазу разница совершенно незначительна. Определенно иначе при работе с большими наборами данных.