Я реализую программу, которая должна сериализовать и десериализовать большие объекты, поэтому я проводил несколько тестов с pickle
, cPickle
и маршал
модулей, чтобы выбрать лучший модуль. Попутно я обнаружил кое-что очень интересное:
Я использую дампы
, а затем загружаю
(для каждого модуля) в список словарей, кортежей, целых чисел, чисел с плавающей точкой и строк. .
Это результат моего теста:
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
.
Что касается оперативной памяти, то производительность маршала
и загрузки также была очень неэффективной:
Я предполагаю, почему загрузка с помощью маршала
так slow как-то связан с длиной его сериализованной строки (намного длиннее, чем pickle
и cPickle
).
marshal
выгружает быстрее и загружается медленнее? marshal
сериализованная строка такая длинная? marshal
загружается так неэффективно в ОЗУ? marshal
? marshal
fast dumping с cPickle
] быстрая загрузка?