Почему файлы Pickle в протоколе Pickle 4 в два раза больше, чем в протоколе 3 без каких-либо успехов?

Я тестирую Python 3.4, и я заметил, что модуль рассола имеет новый протокол. Поэтому я сравниваю 2 протокола.

def test1(): pickle3=open("pickle3","wb") for i in range(1000000): pickle.dump(i,pickle3,3) pickle3.close() pickle3=open("pickle3","rb") for i in range(1000000): pickle.load(pickle3) def test2(): pickle4=open("pickle4","wb") for i in range(1000000): pickle.dump(i, pickle4,4) pickle3.close() pickle4=open("pickle4","rb") for i in range(1000000): pickle.load(pickle4) 

test1 mark: 2000007 вызовов функций в 6.473 секунды

метка test2: 2000007 вызовов функций за 6.740 секунд

Протокол 4 немного медленнее, чем протокол 3. Такую разницу можно игнорировать. Однако использование жесткого диска действительно отличается.

pickle3 использует 7 868 672 байта.

pickle4 использует 16 868 672 байта.

Это не причина. Я продолжаю выкапывать. После чтения PEP3154 я грубо понимаю протокол.

для Корпорации (1,2,3,4,5,6,7) Протокола 3

  0: \x80 PROTO 3 2: ( MARK 3: K BININT1 1 5: K BININT1 2 7: K BININT1 3 9: K BININT1 4 11: K BININT1 5 13: K BININT1 6 15: K BININT1 7 17: t TUPLE (MARK at 2) 18: q BINPUT 0 20: . STOP 

для Tuple (1,2,3,4,5,6,7) Протокола 4

  0: \x80 PROTO 4 2: \x95 FRAME 18 11: ( MARK 12: K BININT1 1 14: K BININT1 2 16: K BININT1 3 18: K BININT1 4 20: K BININT1 5 22: K BININT1 6 24: K BININT1 7 26: t TUPLE (MARK at 11) 27: \x94 MEMOIZE 28: . STOP 

Неуправляемый протокол 3 не может знать длину данных до тех пор, пока не будет прочитано положение 17.

Для протокола 4, от позиции 2 до позиции 18, есть заголовок, который показывает длину.

Тем не менее, я все еще не понимаю, почему я плачу цену (почти вдвое больше, чем использование жесткого диска в экстремальной ситуации), но скорость такая же или потенциально медленная?

One Solution collect form web for “Почему файлы Pickle в протоколе Pickle 4 в два раза больше, чем в протоколе 3 без каких-либо успехов?”

Вы травляете ints. Нет никакого преимущества в том, чтобы заранее знать размер структуры для такого простого типа данных. Для более сложных структур знание размера фрейма – огромный выигрыш в скорости обработки. Кроме того, протокол 4 поднимает множество ограничений для 64-битных систем.

  • В чем разница между классами tkinter Tk и Toplevel?
  • Почему поведение отличается от глобальных переменных в «модуле импорта» и «от импорта модуля»?
  • Python file.tell () дает странные числа?
  • python3.3 matplotlib не может импортировать имя _tkagg
  • Как установить порядок вкладок в приложении tkinter?
  • Зачем использовать встроенные функции setattr () и getattr ()?
  • Найти уникальную пару (ключ: значение), заданную N dictionnaries в python
  • Почему методы, обработанные обезьяной, не передают ссылку на экземпляр?
  • Python - лучший язык программирования в мире.