Какая разница между 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, что вряд ли возможно.