¿Qué diferencia hay entre pickle y _pickle en python 3?

Soy nuevo en Python y quiero implementar una serialización rápida de objetos. Estaba tratando de usar json, pero era demasiado lento, también estaba tratando de usar el módulo marshall, pero el tamaño de los objetos serializados por marshall 6-7 veces más que pickle, así que decidí usar pickle en mi proyecto. Leí sobre el módulo cPickle, lo leí bastante rápido, pero no hay tal módulo en Python 3 y docs dice que el módulo llamado _pickle está escrito en C. Así que 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 de objetos más rápida?

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.

Desde el 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 cuando está disponible. De lo contrario, se utiliza la implementación pura de Python.

En Python 2, _pickle se conocía como cPickle , pero se ha actualizado para permitir el uso transparente como detalle de implementación.

Desde la sección Cambios en 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 coloca la carga de importar la versión acelerada y recurrir a la versión Python pura 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 Python pura. El par pickle / cPickle recibió este tratamiento. El módulo de perfil está en la lista de 3.1. El módulo StringIO se ha convertido en una clase en el módulo io.

Como es una convención de Python que los detalles de la implementación se añaden con un guión bajo, cPickle convirtió en _pickle . En particular, esto significa que si está importando _pickle , la API no tiene un contrato garantizado y podría interrumpir la compatibilidad en versiones futuras de python3, por muy improbable que sea.