Estoy implementando un programa que necesita serializar y deserializar objetos grandes, así que estaba haciendo algunas pruebas con los módulos pickle
, cPickle
y marshal
para elegir el mejor módulo. En el camino encontré algo muy interesante:mariscal vuelca más rápido, cPickle carga más rápido
Estoy usando dumps
y luego loads
(para cada módulo) en una lista de dicts, tuples, ints, float y strings.
Ésta es la salida de mi punto de referencia:
DUMPING a list of length 7340032
----------------------------------------------------------------------
pickle => 14.675 seconds
length of pickle serialized string: 31457430
cPickle => 2.619 seconds
length of cPickle serialized string: 31457457
marshal => 0.991 seconds
length of marshal serialized string: 117440540
LOADING a list of length: 7340032
----------------------------------------------------------------------
pickle => 13.768 seconds
(same length?) 7340032 == 7340032
cPickle => 2.038 seconds
(same length?) 7340032 == 7340032
marshal => 6.378 seconds
(same length?) 7340032 == 7340032
Así, a partir de estos resultados se puede ver que marshal
era extremadamente rápido en el vertido parte del índice de referencia:
14.8x veces más rápido que
pickle
y 2.6 veces más rápido quecPickle
.
Pero, para mi gran sorpresa, marshal
era, con mucho, más lento que en el cPickle
parte carga:
2.2x veces más rápido que
pickle
, pero 3.1x veces más lento quecPickle
.
Y en cuanto a memoria RAM, mientras que el rendimiento marshal
carga también fue muy ineficiente:
Supongo que la razón por la carga con marshal
es tan lento de alguna manera está relacionado con la longitud de su serie serializada (mucho más larga que pickle
y cPickle
).
- ¿Por qué
marshal
volcamientos más rápidos y más lentos? - ¿Por qué
marshal
serie serializada es tan larga? - ¿Por qué la carga de
marshal
es tan ineficiente en la RAM? - ¿Hay alguna forma de mejorar el rendimiento de carga de
marshal
? - ¿Hay alguna forma de combinar
marshal
volcado rápido concPickle
cargando rápidamente?
downvoter, importar para compartir? – juliomalegria
Tu pregunta es un callejón sin salida. El módulo 'mariscal' no está destinado a ser utilizado como una alternativa a' pickle'. No hay documentación oficial para el formato de archivo Marshal y podría cambiar de una versión a otra, por lo que los resultados de su evaluación comparativa podrían ser falsos en el futuro. –
En cuanto a las diferencias de velocidad: sospecho que todo se trata del archivo IO: el archivo producido por el jefe de policía es casi cuatro veces más grande (112 MB frente a 30 MB). –