source recognize recognition raspberry neural network how facial face_recognition dlib code python serialization python-3.x

recognize - ¿Qué diferencia entre pickle y_pickle en python 3?



python face_recognition github (2)

Soy nuevo en Python y quiero implementar la serialización rápida de objetos. Yo estaba tratando de usar json, pero era demasiado lento, también estaba tratando de usar el módulo de Marshall, pero el tamaño de los objetos serializados por Marshall era 6-7 veces mayor que el pickle, así que decidí usar Pickle en mi proyecto. Leí sobre el módulo cPickle, lo leí bastante rápido, pero no existe dicho módulo en python 3 y Docs dice que el módulo llamado _pickle está escrito en C. Entonces, en mis proyectos lo uso

import _pickle as pickle

¿Hay alguna diferencia entre pickle y _pickle? ¿Cómo puedo implementar la serialización / deserialización más rápida de los objetos?


Desde la sección Cambios de la biblioteca de la documentación de Novedades en Python 3.0 :

Un patrón común en Python 2.x es tener una versión de un módulo implementado en Python puro, con una versión acelerada opcional implementada como una extensión C; por ejemplo, pickle y cPickle . Esto impone la carga de importar la versión acelerada y recurrir a la versión pura de Python en cada usuario de estos módulos. En Python 3.0, las versiones aceleradas se consideran detalles de implementación de las versiones puras de Python. Los usuarios siempre deben importar la versión estándar, que intenta importar la versión acelerada y vuelve a la versión pura de Python. El par pickle / cPickle recibió este tratamiento. El módulo de perfil está en la lista para 3.1. El módulo StringIO se ha convertido en una clase en el módulo io.

Dado que es una convención de Python que los detalles de implementación se antepongan con un guión bajo, cPickle convirtió en _pickle . Cabe destacar que esto significa que si está importando _pickle , la API no tiene contrato garantizado y podría romper la compatibilidad con versiones anteriores en versiones futuras de python3, por improbable que sea.


El módulo pickle ya importa _pickle si está disponible. Es la versión C optimizada del módulo pickle y se utiliza de forma transparente.

Del código fuente de pickle.py :

# Use the faster _pickle if possible try: from _pickle import * except ImportError: Pickler, Unpickler = _Pickler, _Unpickler

y de la documentación del módulo pickle :

El módulo pickle tiene un optimizador transparente ( _pickle ) escrito en C. Se usa siempre que esté disponible. De lo contrario, se utiliza la implementación pura de Python.

En Python 2, _pickle era conocido como cPickle , pero se ha actualizado para permitir el uso transparente como un detalle de implementación.