Я реализую программу, которая должна сериализовать и десериализовать большие объекты, поэтому я проводил некоторые тесты с модулями pickle
, cPickle
и marshal
, чтобы выбрать лучший модуль.По пути я нашел кое-что очень интересное:
Я использую dumps
, а затем loads
(для каждого модуля) в списке диктов, кортежей, целых чисел, чисел с плавающей точкой и строк.
Это результат моего теста:
DUMPING a list of length 7340032
----------------------------------------------------------------------
pickle => 14.675 seconds
length of pickle serialized string: 31457430
cPickle => 2.619 seconds
length of cPickle serialized string: 31457457
marshal => 0.991 seconds
length of marshal serialized string: 117440540
LOADING a list of length: 7340032
----------------------------------------------------------------------
pickle => 13.768 seconds
(same length?) 7340032 == 7340032
cPickle => 2.038 seconds
(same length?) 7340032 == 7340032
marshal => 6.378 seconds
(same length?) 7340032 == 7340032
Итак, из этих результатов мы видим, что marshal
был чрезвычайно быстрым в демпинге части теста:
в 14,8 раза быстрее, чем pickle
и в 2,6 раза быстрее, чем cPickle
.
Но, к моему большому удивлению, marshal
был намного медленнее, чем cPickle
в загрузке часть:
в 2,2 раза быстрее, чем pickle
, но в 3,1 раза медленнее, чем cPickle
.
Что касается оперативной памяти, производительность marshal
при загрузке также была очень неэффективной:

Я предполагаю причину, по которой загрузка с marshal
такая медленная скорость как-то связана с длиной ее сериализованной строки (намного больше, чем pickle
и cPickle
).
- Почему
marshal
сбрасывает быстрее и загружает медленнее? - Почему сериализованная строка
marshal
такая длинная? - Почему загрузка
marshal
в ОЗУ так неэффективна? - Есть ли способ улучшить производительность загрузки
marshal
? - Есть ли способ объединить
marshal
быстрый сброс с cPickle
быстрой загрузкой?