He visto muchos proyectos usando el simplejson
módulo en lugar del json
módulo de la Biblioteca Estándar. Además, hay muchos simplejson
módulos diferentes . ¿Por qué usar estas alternativas, en lugar de la de la Biblioteca estándar?
python
json
simplejson
Lakshman Prasad
fuente
fuente
redefinition of unused 'json'
JSONDecodeError
es una subclase deValueError
Tengo que estar en desacuerdo con las otras respuestas: la
json
biblioteca integrada (en Python 2.7) no es necesariamente más lenta quesimplejson
. Tampoco tiene este molesto error Unicode .Aquí hay un punto de referencia simple:
Y los resultados en mi sistema (Python 2.7.4, Linux 64-bit):
Para el dumping,
json
es más rápido quesimplejson
. Para cargar,simplejson
es más rápido.Dado que actualmente estoy creando un servicio web,
dumps()
es más importante, y siempre se prefiere usar una biblioteca estándar.Además,
cjson
no se actualizó en los últimos 4 años, por lo que no lo tocaría.fuente
json
(CPython 3.5.0) es 68% | 45% más rápido en volcados simples | complejos y 35% | 17% en cargas simples | complejas wrtsimplejson
v3.8.0 con aceleraciones en C usando su código de referencia. Por lo tanto, ya no usaría simplejson con esta configuración.json
gana o es lo mismo para todas las pruebas. De hecho, ¡json
es un poco menos del doble de rápido que la compleja prueba de volcado de datos del mundo real!Todas estas respuestas no son muy útiles porque son sensibles al tiempo .
Después de investigar un poco por mi cuenta, descubrí que
simplejson
es más rápido que el incorporado, si lo mantiene actualizado a la última versión.pip/easy_install
quería instalar 2.3.2 en ubuntu 12.04, pero después de descubrir que la últimasimplejson
versión es en realidad 3.3.0, lo actualicé y volví a probar las pruebas de tiempo.simplejson
es aproximadamente 3 veces más rápido que el incorporadojson
en las cargassimplejson
es aproximadamente un 30% más rápido que el incorporadojson
en los vertederosDescargo de responsabilidad:
Las declaraciones anteriores están en python-2.7.3 y simplejson 3.3.0 (con aceleraciones c) Y para asegurarse de que mi respuesta tampoco sea sensible al tiempo, debe ejecutar sus propias pruebas para verificar, ya que varía mucho entre versiones; No hay una respuesta fácil que no sea sensible al tiempo.
Cómo saber si las aceleraciones de C están habilitadas en simplejson:
ACTUALIZACIÓN: Recientemente me encontré con una biblioteca llamada ujson que funciona ~ 3 veces más rápido que
simplejson
con algunas pruebas básicas.fuente
He estado comparando json, simplejson y cjson.
http://pastie.org/1507411 :
fuente
Algunos valores se serializan de manera diferente entre simplejson y json.
En particular, las instancias de
collections.namedtuple
se serializan como matrices porjson
pero como objetos porsimplejson
. Puede anular este comportamiento pasandonamedtuple_as_object=False
asimplejson.dump
, pero de forma predeterminada los comportamientos no coinciden.fuente
Una incompatibilidad API que encontré, con Python 2.7 vs simplejson 3.3.1 está en si la salida produce objetos str o unicode. p.ej
vs
Si la preferencia es usar simplejson, entonces esto puede abordarse coaccionando la cadena de argumento a unicode, como en:
La coerción requiere conocer el juego de caracteres original, por ejemplo:
Este es el problema no soluciona 40
fuente
Otra razón por la que los proyectos usan simplejson es que el json incorporado originalmente no incluía sus aceleraciones en C, por lo que la diferencia de rendimiento fue notable.
fuente
El
json
módulo incorporado se incluyó en Python 2.6. Cualquier proyecto que admita versiones de Python <2.6 debe tener un respaldo. En muchos casos, ese retroceso essimplejson
.fuente
Aquí hay una comparación (ahora desactualizada) de las bibliotecas Python json:
Comparación de módulos JSON para Python ( enlace de archivo )
Independientemente de los resultados en esta comparación, debe usar la biblioteca estándar json si está en Python 2.6. Y ... también podría usar simplejson de lo contrario.
fuente
El módulo simplejson es simplemente 1,5 veces más rápido que json (en mi computadora, con simplejson 2.1.1 y Python 2.7 x86).
Si lo desea, puede probar el punto de referencia: http://abral.altervista.org/jsonpickle-bench.zip En mi PC, simplejson es más rápido que cPickle. ¡Me gustaría conocer también sus puntos de referencia!
Probablemente, como dijo Coady, la diferencia entre simplejson y json es que simplejson incluye _speedups.c. Entonces, ¿por qué los desarrolladores de Python no usan simplejson?
fuente
En python3, si tiene una cadena de
b'bytes'
, debe accederjson
al.decode()
contenido antes de poder cargarlo.simplejson
se encarga de esto para que puedas hacerlosimplejson.loads(byte_string)
.fuente
json
parece más rápido quesimplejson
en ambos casos de cargas y volcados en la última versiónVersiones probadas:
Resultados:
Para versiones:
json fue más rápido que simplejson durante la operación de volcados pero ambos mantuvieron la misma velocidad durante las operaciones de carga
fuente
Encontré esta pregunta cuando estaba buscando instalar simplejson para Python 2.6. Necesitaba usar el 'object_pairs_hook' de json.load () para cargar un archivo json como un OrderedDict. Al estar familiarizado con las versiones más recientes de Python, no me di cuenta de que el módulo json para Python 2.6 no incluye el 'object_pairs_hook', así que tuve que instalar simplejson para este propósito. Por experiencia personal, esta es la razón por la que uso simplejson en lugar del módulo json estándar.
fuente