Какая разница между pickle и _pickle в python 3?

Я новичок в python и хочу реализовать сериализацию объектов быстро. Я пытался использовать json, но он был слишком медленным, также пытался использовать модуль marshall, но размер объектов, сериализованных маршалом в 6-7 раз больше, чем рассол, поэтому я решил использовать марихуану в моем проекте. Я читал о модуле cPickle, читал, что он довольно быстро, но нет такого модуля в python 3, и документы говорят, что модуль с именем _pickle написан на C. Поэтому в моих проектах я использую

import _pickle as pickle

Есть ли разница между pickle и _pickle? Как я могу реализовать более быструю сериализацию/десериализацию объектов?

Ответ 1

Модуль pickle уже импортирует _pickle, если он доступен. Это C-оптимизированная версия модуля pickle и используется прозрачно.

Из pickle.py исходного кода:

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

и из документации pickle:

Модуль pickle имеет прозрачный оптимизатор (_pickle), написанный на C. Он используется всякий раз, когда он доступен. В противном случае используется чистая реализация Python.

В Python 2 _pickle был известен как cPickle, но был обновлен, чтобы прозрачное использование в качестве детали реализации.

Ответ 2

В разделе Изменения в библиотеке раздела Что нового в Python 3.0 документация:

Общий шаблон в Python 2.x должен иметь одну версию модуля реализованный в чистом Python, с опциональной ускоренной версией реализуется как расширение C; например, pickle и cPickle. Эта ставит бремя импорта ускоренной версии и падает обратно на чистую версию Python для каждого пользователя этих модулей. В Python 3.0, ускоренные версии рассматриваются как реализация детали чистых версий Python. Пользователи всегда должны импортировать стандартной версии, которая пытается импортировать ускоренную версию и возвращается к чистой версии Python. Пара pickle/cPickleполучил это лечение. Модуль профиля находится в списке для 3.1. Модуль StringIO был преобразован в класс в модуле io.

Так как это соглашение на питоне, детали реализации дополняются символом подчеркивания, cPickle стал _pickle. Примечательно, что это означает, что если вы импортируете _pickle, API не имеет гарантированного контракта и может разорвать назад совместимость в будущих выпусках python3, что вряд ли возможно.