Python: JSON vs Pickle
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

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

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