Wdrażam program, który musi serializować i deserializować duże obiekty, więc robiłem testy z pickle
, cPickle
i marshal
modułów, aby wybrać najlepszy moduł. Po drodze znalazłem coś bardzo interesującego:marszałek rzuca szybciej, cPickle ładuje się szybciej
Używam dumps
, a następnie loads
(dla każdego modułu) na liście dykt, krotek, int, float i stringów.
Jest to wyjście z mojego odniesienia:
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
Tak, z tych wyników możemy zobaczyć, że marshal
był bardzo szybki w dumping część benchmarku:
14.8x razy szybszy niż
pickle
i 2,6x razy szybszy niżcPickle
.
Ale dla mojego wielkiego zaskoczenia, marshal
był zdecydowanie wolniejszy niż cPickle
w załadunku części:
2.2x razy szybciej niż
pickle
, ale 3.1x razy wolniej niżcPickle
.
A co do pamięci RAM, marshal
wydajność podczas loading był również bardzo nieefektywne:
Zgaduję dlaczego ładowanie z marshal
jest tak powolny, jest w jakiś sposób związany z długością serializowanego ciągu znaków (znacznie dłuższego niż pickle
i cPickle
).
- Dlaczego
marshal
zrzuca szybciej i ładuje wolniej? - Dlaczego serializowany ciąg znaków
marshal
jest tak długi? - Dlaczego ładowanie
marshal
jest tak niewydajne w pamięci RAM? - Czy istnieje sposób na poprawę wydajności ładowania
marshal
? - Czy istnieje sposób na szybkie połączenie z
marshal
szybkim ładowaniem zcPickle
?
downvoter, chcesz się podzielić? – juliomalegria
Twoje pytanie jest ślepym zaułkiem. Moduł 'marshal' nie jest używany jako alternatywa dla' pickle'. Nie ma oficjalnej dokumentacji dla formatu pliku marshmala i może ona zmieniać się z wersji na wersję, więc wyniki testu porównawczego mogą być fałszywe w przyszłości. –
Jeśli chodzi o różnice prędkości: podejrzewam, że wszystko zależy od pliku IO: Plik wyprodukowany przez marszałka jest prawie czterokrotnie większy (112 MB vs. 30 MB). –