Necesito guardar en el disco un pequeño dict
objeto cuyas claves son del tipo str
y los valores son int
sy 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.
simplejson
usaríasjson
, usarías el módulo incorporado (que tiene exactamente la misma interfaz).Respuestas:
Si no tiene ningún requisito de interoperabilidad (por ejemplo, solo va a usar los datos con Python) y un formato binario está bien, vaya con cPickle, que le brinda una serialización de objetos Python realmente rápida.
Si desea interoperabilidad o desea un formato de texto para almacenar sus datos, vaya con JSON (o algún otro formato apropiado según sus limitaciones).
fuente
cPickle
(opickle
) en función de sus instalaciones a través de JSON. Cuando leí su respuesta por primera vez, pensé que la razón podría haber sido la velocidad, pero como este no es el caso ... :)Prefiero JSON sobre pickle para mi serialización. Unpickling puede ejecutar código arbitrario y usarlo
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 en diferentes idiomas pueden acceder a los datos si alguna vez lo necesita.fuente
También puede encontrar esto interesante, con algunos gráficos para comparar: http://kovshenin.com/archives/pickle-vs-json-which-is-faster/
fuente
pickle
latejson
enint
,str
yfloat
.Si lo que más le preocupa es la velocidad y el espacio, use cPickle porque cPickle es más rápido que JSON.
Si está más preocupado por la interoperabilidad, la seguridad y / o la legibilidad humana, utilice JSON.
Los resultados de las pruebas a los que se hace referencia en otras respuestas se registraron en 2010, y las pruebas actualizadas en 2016 con el protocolo cPickle 2 muestran:
Reproduzca esto usted mismo con esta esencia , que se basa en el punto de referencia de Konstantin al que se hace referencia en otras respuestas, pero usando 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
Resultados con python 2.7 en un procesador Xeon 2015 decente:
Python 3.4 con el protocolo pickle 3 es aún más rápido.
fuente
JSON o pepinillo? ¿Qué tal JSON y pickle? Puede utilizar
jsonpickle
. Es fácil de usar y el archivo en el disco se puede leer porque es JSON.http://jsonpickle.github.com/
fuente
Probé varios métodos y descubrí que usar cPickle con la configuración del 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.Salida:
fuente
Personalmente, generalmente prefiero JSON porque los datos son legibles por humanos . Definitivamente, si necesita serializar algo que JSON no aceptará, 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.
fuente
pickle
es más del doble de rápido quejson
.100
elementos de una lista, la diferencia es completamente insignificante para el ojo humano. Definitivamente diferente cuando se trabaja con conjuntos de datos más grandes.