Saya perlu menyimpan ke disk sebuah dict
objek kecil yang kuncinya berjenis str
dan nilainya adalah int
s dan kemudian memulihkannya . Sesuatu seperti ini:
{'juanjo': 2, 'pedro':99, 'other': 333}
Apa pilihan terbaik dan mengapa? Serialisasi dengan pickle
atau dengan simplejson
?
Saya menggunakan Python 2.6.
simplejson
, Anda akan menggunakanjson
modul builtin (yang memiliki antarmuka yang persis sama).Jawaban:
Jika Anda tidak memiliki persyaratan interoperabilitas (misalnya Anda hanya akan menggunakan data dengan Python) dan format biner baik-baik saja, gunakan cPickle yang memberi Anda serialisasi objek Python yang sangat cepat.
Jika Anda ingin interoperabilitas atau Anda ingin format teks untuk menyimpan data Anda, gunakan JSON (atau beberapa format lain yang sesuai tergantung pada batasan Anda).
sumber
cPickle
(ataupickle
) berdasarkan tempat Anda melalui JSON. Ketika saya pertama kali membaca jawaban Anda, saya pikir alasannya mungkin karena kecepatan, tetapi karena bukan ini masalahnya ... :)Saya lebih suka JSON daripada acar untuk serialisasi saya. Pemisahan dapat menjalankan kode arbitrer, dan menggunakan
pickle
untuk mentransfer data antar program atau menyimpan data antar sesi adalah celah keamanan. JSON tidak memperkenalkan celah keamanan dan sudah terstandarisasi, sehingga data dapat diakses oleh program dalam bahasa yang berbeda jika diperlukan.sumber
Anda mungkin juga menganggap ini menarik, dengan beberapa bagan untuk dibandingkan: http://kovshenin.com/archives/pickle-vs-json-which-is-faster/
sumber
pickle
mengalahkanjson
diint
,str
, danfloat
.Jika Anda terutama mementingkan kecepatan dan ruang, gunakan cPickle karena cPickle lebih cepat daripada JSON.
Jika Anda lebih mementingkan interoperabilitas, keamanan, dan / atau keterbacaan manusia, gunakan JSON.
Hasil tes yang direferensikan dalam jawaban lain dicatat pada tahun 2010, dan tes yang diperbarui pada tahun 2016 dengan protokol cPickle 2 menunjukkan:
Reproduksi ini sendiri dengan intisari ini , yang didasarkan pada tolok ukur Konstantin yang dirujuk dalam jawaban lain, tetapi menggunakan cPickle dengan protokol 2 alih-alih acar, dan menggunakan json daripada simplejson (karena json lebih cepat daripada simplejson ), misalnya
Hasil dengan python 2.7 pada prosesor Xeon 2015 yang layak:
Python 3.4 dengan protokol acar 3 bahkan lebih cepat.
sumber
JSON atau acar? Bagaimana dengan JSON dan acar! Anda bisa menggunakan
jsonpickle
. Mudah digunakan dan file di disk dapat dibaca karena ini JSON.http://jsonpickle.github.com/
sumber
Saya telah mencoba beberapa metode dan menemukan bahwa menggunakan cPickle dengan menetapkan argumen protokol metode dumps sebagai:
cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)
adalah metode dump tercepat.Keluaran:
sumber
Secara pribadi, saya biasanya lebih suka JSON karena datanya dapat dibaca manusia . Tentunya, jika Anda perlu membuat serialisasi sesuatu yang tidak akan diambil JSON, daripada menggunakan acar.
Tetapi untuk sebagian besar penyimpanan data, Anda tidak perlu membuat serialisasi apa pun yang aneh dan JSON jauh lebih mudah dan selalu memungkinkan Anda untuk membukanya di editor teks dan memeriksa datanya sendiri.
Kecepatannya bagus, tetapi untuk sebagian besar kumpulan data perbedaannya dapat diabaikan; Python umumnya tidak terlalu cepat.
sumber
pickle
lebih dari dua kali lebih cepatjson
.100
elemen dalam daftar, perbedaannya dapat diabaikan sepenuhnya oleh mata manusia. Sangat berbeda ketika bekerja dengan kumpulan data yang lebih besar.