Я реализую программу, которая требует сериализации и десериализации больших объектов, поэтому я делал несколько тестов с модулями pickle, cPickle и marshal, чтобы выбрать лучший модуль. По пути я нашел что-то очень интересное:
Я использую dumps, а затем loads (для каждого модуля) в списке dicts, tuples, ints, float и string.
Это результат моего теста:
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,8x раз быстрее, чем
pickleи в 2,6 раза быстрее, чемcPickle.
Но, к моему большому удивлению, marshal был намного медленнее, чем cPickle в загрузке:
В 2,2 раза быстрее, чем
pickle, но в 3,1 раза меньше, чемcPickle.
А для оперативной памяти производительность marshal при загрузке также была очень неэффективной:

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