with saving open how python json pickle

saving - python pickle function



Pickle o json? (7)

He intentado varios métodos y descubrí que usar cPickle para establecer el argumento de protocolo del método de volcados como: cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL) es el método de volcado más rápido.

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)

Salida:

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

Necesito guardar en el disco un pequeño objeto dict cuyas claves son del tipo str y los valores son int s y luego recuperarlo . Algo como esto:

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

¿Cuál es la mejor opción y por qué? ¿Serializarlo con pickle o con simplejson ?

Estoy usando Python 2.6.


JSON o pickle? ¿Qué tal JSON y Pickle? Puedes usar jsonpickle . Es fácil de usar y el archivo en el disco es legible porque es JSON.

http://jsonpickle.github.com/


Personalmente, generalmente prefiero JSON porque los datos son legibles por los humanos . Definitivamente, si necesita serializar algo que JSON no tomará, use pickle.

Pero para la mayoría del almacenamiento de datos, no necesitará serializar nada extraño y JSON es mucho más fácil y siempre le permite abrirlo en un editor de texto y verificar los datos usted mismo.

La velocidad es buena, pero para la mayoría de los conjuntos de datos la diferencia es insignificante; Python generalmente no es demasiado rápido de todos modos.


Prefiero JSON sobre pickle para mi serialización. La eliminación de fondos puede ejecutar código arbitrario, y usar pickle para transferir datos entre programas o almacenar datos entre sesiones es un agujero de seguridad. JSON no introduce un agujero de seguridad y está estandarizado, por lo que los programas pueden acceder a los datos en diferentes idiomas si alguna vez lo necesita.


Si le preocupa principalmente la velocidad y el espacio, use cPickle porque cPickle es más rápido que JSON.

Si está más interesado en la interoperabilidad, la seguridad y la legibilidad humana, utilice JSON.

Los resultados de las pruebas mencionados en otras respuestas se registraron en 2010, y las pruebas actualizadas en 2016 con el protocolo cPickle 2 muestran:

  • cPickle 3.8x cargando más rápido
  • cPickle 1.5 veces más rápido de lectura
  • cPickle codificación un poco más pequeña

Reproduzca esto usted mismo con esta idea , que se basa en la referencia de Konstantin a la que se hace referencia en otras respuestas, pero utilizando cPickle con el protocolo 2 en lugar de pickle y usando json en lugar de simplejson (ya que json es más rápido que simplejson ), por ejemplo

wget https://gist.github.com/jdimatteo/af317ef24ccf1b3fa91f4399902bb534/raw/03e8dbab11b5605bc572bc117c8ac34cfa959a70/pickle_vs_json.py python pickle_vs_json.py

Resultados con python 2.7 en un procesador decente Xeon 2015:

Dir Entries Method Time Length dump 10 JSON 0.017 1484510 load 10 JSON 0.375 - dump 10 Pickle 0.011 1428790 load 10 Pickle 0.098 - dump 20 JSON 0.036 2969020 load 20 JSON 1.498 - dump 20 Pickle 0.022 2857580 load 20 Pickle 0.394 - dump 50 JSON 0.079 7422550 load 50 JSON 9.485 - dump 50 Pickle 0.055 7143950 load 50 Pickle 2.518 - dump 100 JSON 0.165 14845100 load 100 JSON 37.730 - dump 100 Pickle 0.107 14287900 load 100 Pickle 9.907 -

Python 3.4 con el protocolo pickle 3 es aún más rápido.


Si no tiene requisitos de interoperabilidad (por ejemplo, solo va a utilizar los datos con Python) y un formato binario está bien, vaya con cPickle que le proporciona una serialización de objetos de Python realmente rápida.

Si desea interoperabilidad o desea un formato de texto para almacenar sus datos, vaya con JSON (u otro formato apropiado según sus limitaciones).