Я реализую программу, которая требует сериализации и десериализации больших объектов, поэтому я делал несколько тестов с модулями 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
быстрой загрузкой?