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

Другие вопросы по тегам