python - serialize - Рассол или json?




python serialize object to json (5)

Мне нужно сохранить на диск небольшой объект dict , ключи которого имеют тип str а значения - int s, а затем восстановить его . Что-то вроде этого:

{'juanjo': 2, 'pedro':99, 'other': 333}

Каков наилучший вариант и почему? Сериализовать его с pickle или с помощью simplejson ?

Я использую Python 2.6.


JSON или рассол? Как насчет JSON и мариновать! Вы можете использовать jsonpickle . Он прост в использовании, и файл на диске читается, потому что это JSON.

http://jsonpickle.github.com/



Если у вас нет каких-либо требований к совместимости (например, вы собираетесь использовать данные с Python), а бинарный формат в порядке, перейдите с cPickle который дает вам очень быструю сериализацию объектов Python.

Если вам нужна совместимость или вы хотите, чтобы текстовый формат сохранял ваши данные, перейдите в JSON (или какой-либо другой соответствующий формат в зависимости от ваших ограничений).


Лично я обычно предпочитаю JSON, потому что данные являются удобочитаемыми для человека . Определенно, если вам нужно сериализовать то, что JSON не возьмет, чем использовать pickle.

Но для большинства хранилищ данных вам не нужно сериализовать что-нибудь странное, а JSON намного проще и всегда позволяет вам открывать его в текстовом редакторе и самостоятельно проверять данные.

Скорость хорошая, но для большинства наборов данных разница незначительна; Python вообще не слишком быстр.


Я пробовал несколько методов и выяснил, что использование cPickle с настройкой аргумента протокола метода дампов как: cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL) является самым быстрым методом дампа.

import msgpack
import json
import pickle
import timeit
import cPickle
import numpy as np

num_tests = 10

obj = np.random.normal(0.5, 1, [240, 320, 3])

command = 'pickle.dumps(obj)'
setup = 'from __main__ import pickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("pickle:  %f seconds" % result)

command = 'cPickle.dumps(obj)'
setup = 'from __main__ import cPickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("cPickle:   %f seconds" % result)


command = 'cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)'
setup = 'from __main__ import cPickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("cPickle highest:   %f seconds" % result)

command = 'json.dumps(obj.tolist())'
setup = 'from __main__ import json, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("json:   %f seconds" % result)


command = 'msgpack.packb(obj.tolist())'
setup = 'from __main__ import msgpack, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("msgpack:   %f seconds" % result)

Вывод:

pickle         :   0.847938 seconds
cPickle        :   0.810384 seconds
cPickle highest:   0.004283 seconds
json           :   1.769215 seconds
msgpack        :   0.270886 seconds




pickle