Какая разница между pickle и _pickle в python 3?
Я новичок в Python и хочу реализовать быструю сериализацию объектов. Я пытался использовать json, но это было слишком медленно, также пытался использовать модуль marshall, но размер объектов, сериализуемых с помощью Marshall, в 6-7 раз больше, чем pickle, поэтому я решил использовать pickle в своем проекте. Я читал о модуле cPickle, читал, что он довольно быстрый, но в python 3 такого модуля нет, и в документации сказано, что модуль с именем _pickle написан на C. Поэтому в моих проектах я использую
import _pickle as pickle
Есть ли разница между рассолом и _пиклом? Как я могу реализовать более быструю сериализацию / десериализацию объектов?
2 ответа
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
, но был обновлен, чтобы позволить прозрачное использование в качестве детали реализации.
Из раздела Изменения библиотеки документации Что нового в Python 3.0:
Распространенный шаблон в Python 2.x - иметь одну версию модуля, реализованную на чистом Python, с необязательной ускоренной версией, реализованной как расширение C; например,
pickle
а такжеcPickle
, Это возлагает бремя импорта ускоренной версии и использования чистой версии Python на каждого пользователя этих модулей. В Python 3.0 ускоренные версии считаются деталями реализации чистых версий Python. Пользователи всегда должны импортировать стандартную версию, которая пытается импортировать ускоренную версию и возвращается к чистой версии Python.pickle
/cPickle
пара получила это лечение. Модуль профиля находится в списке для 3.1.StringIO
модуль был превращен в класс в модуле io.
Поскольку это соглашение Python, детали реализации предваряются подчеркиванием, cPickle
стал _pickle
, В частности, это означает, что если вы импортируете _pickle
API не имеет гарантированного контракта и может нарушить обратную совместимость в будущих выпусках python3, что вряд ли возможно.