Tarde o temprano toca serializar datos, y Python trae de serie más de una forma de hacerlo. La pregunta es cuál es más eficiente.

JSON vs Pickle

La biblioteca estándar incluye dos serializadores: JSON y Pickle. Antes de quedarse con uno hay un par de cosas que conviene medir:

  • cuánto tarda en serializar
  • cuánta memoria consume

Para responder a eso escribí un benchmark pequeño que prueba los dos. Genera 10, 500 y 1000 elementos aleatorios y mide esas dos cifras en cada tanda.

También metí en la comparativa UltraJSON, una biblioteca JSON de alto rendimiento para Python.

Y de Pickle probé las dos últimas versiones del protocolo, la 4 y la 5.

Resultados

La salida en bruto es esta:

Number of elements:  10
-----------------------

Json Size:  0.02715015411376953 MB
Json time:  0.006659951999999997 sec
UJson time:  0.0030970319999999996 sec
Pickle Size Proto 5:  0.02531909942626953 MB
Pickle time Proto 5:  0.003745575000000001 sec
Pickle Size Proto 4:  0.02531909942626953 MB
Pickle time Proto 4:  0.0031195769999999984 sec

Number of elements:  500
------------------------

Json Size:  24.98400592803955 MB
Json time:  1.651241939 sec
UJson time:  0.6243056419999997 sec
Pickle Size Proto 5:  25.035669326782227 MB
Pickle time Proto 5:  0.38723978699999995 sec
Pickle Size Proto 4:  25.035669326782227 MB
Pickle time Proto 4:  0.38475265300000006 sec

Number of elements:  1000
-------------------------

Json Size:  98.13797855377197 MB
Json time:  6.275222810999999 sec
UJson time:  2.5652533450000004 sec
Pickle Size Proto 5:  98.24791717529297 MB
Pickle time Proto 5:  1.3807646590000004 sec
Pickle Size Proto 4:  98.24791717529297 MB
Pickle time Proto 4:  1.3946891620000006 sec

Lo mismo en gráficas:

Comparando el consumo de memoria

consumo de memoria

No hay diferencia real entre JSON, UJson, Pickle v5 y Pickle v4. Todos ocupan más o menos lo mismo.

Comparando el tiempo de serialización

tiempo de serialización

Aquí la diferencia sí se nota. Gana Pickle, con UJson bastante cerca.