Muszę zapisać na dysku mały dict
obiekt, którego klucze są typu str
i wartości int
s, a następnie odzyskać go . Coś takiego:
{'juanjo': 2, 'pedro':99, 'other': 333}
Jaka jest najlepsza opcja i dlaczego? Serializować go z pickle
czy z simplejson
?
Używam Pythona 2.6.
simplejson
, użyłbyś wbudowanegojson
modułu (który ma dokładnie taki sam interfejs).Odpowiedzi:
Jeśli nie masz żadnych wymagań dotyczących interoperacyjności (np. Zamierzasz po prostu używać danych w Pythonie) i format binarny jest w porządku, wybierz cPickle, który zapewnia naprawdę szybką serializację obiektów Pythona.
Jeśli chcesz współdziałania lub chcesz mieć format tekstowy do przechowywania danych, wybierz JSON (lub inny odpowiedni format w zależności od ograniczeń).
źródło
cPickle
(lubpickle
) w oparciu o twoje przesłanki przez JSON. Kiedy po raz pierwszy przeczytałem twoją odpowiedź, pomyślałem, że powodem może być szybkość, ale ponieważ tak nie jest ... :)Wolę JSON niż pikle do mojej serializacji. Unpickling może uruchomić dowolny kod, a używanie go
pickle
do przesyłania danych między programami lub przechowywania danych między sesjami jest luką w zabezpieczeniach. JSON nie wprowadza luki w zabezpieczeniach i jest ustandaryzowany, więc do danych mogą mieć dostęp programy w różnych językach, jeśli kiedykolwiek zajdzie taka potrzeba.źródło
Może Cię to również zainteresować, z kilkoma wykresami do porównania: http://kovshenin.com/archives/pickle-vs-json-which-is-faster/
źródło
pickle
bijejson
sięint
,str
orazfloat
.Jeśli interesuje Cię przede wszystkim szybkość i przestrzeń, użyj cPickle, ponieważ cPickle jest szybszy niż JSON.
Jeśli bardziej interesuje Cię współdziałanie, bezpieczeństwo i / lub czytelność dla człowieka, użyj formatu JSON.
Wyniki testów, o których mowa w innych odpowiedziach, zostały zarejestrowane w 2010 roku, a zaktualizowane testy z 2016 roku z protokołem 2 cPickle pokazują:
Odtworzyć to sam z tym sednem , który jest oparty na benchmarku Konstantina, do którego odwołują się inne odpowiedzi, ale używając cPickle z protokołem 2 zamiast pickle i używając json zamiast simplejson (ponieważ json jest szybszy niż simplejson ), np.
Wyniki z Pythonem 2.7 na przyzwoitym procesorze Xeon 2015:
Python 3.4 z protokołem pickle 3 jest jeszcze szybszy.
źródło
JSON czy marynata? Co powiesz na JSON i marynatę! Możesz użyć
jsonpickle
. Jest łatwy w użyciu, a plik na dysku jest czytelny, ponieważ jest to JSON.http://jsonpickle.github.com/
źródło
Wypróbowałem kilka metod i odkryłem, że użycie cPickle z ustawieniem argumentu protokołu metody zrzutów jako:
cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)
jest najszybszą metodą zrzutu.Wynik:
źródło
Osobiście generalnie wolę JSON, ponieważ dane są czytelne dla człowieka . Zdecydowanie, jeśli chcesz serializować coś, czego JSON nie przejmie, użyj marynaty.
Ale w przypadku większości przechowywania danych nie musisz serializować niczego dziwnego, a JSON jest znacznie łatwiejszy i zawsze pozwala otworzyć go w edytorze tekstu i samodzielnie sprawdzić dane.
Szybkość jest niezła, ale w przypadku większości zbiorów danych różnica jest znikoma; Python generalnie i tak nie jest zbyt szybki.
źródło
pickle
jest ponad dwukrotnie szybszy niżjson
.100
elementów na liście różnica jest całkowicie nieistotna dla ludzkiego oka. Zdecydowanie inaczej podczas pracy z większymi zbiorami danych.