अचार या जसन?


114

मुझे एक छोटी सी dictवस्तु को डिस्क में सहेजने की आवश्यकता है जिसकी कुंजी प्रकार strऔर मान intएस हैं और फिर इसे पुनर्प्राप्त करें । कुछ इस तरह:

{'juanjo': 2, 'pedro':99, 'other': 333}

सबसे अच्छा विकल्प क्या है और क्यों? इसे pickleया उसके साथ सीरियल करें simplejson?

मैं पाइथन 2.6 का उपयोग कर रहा हूं।


इसे परिवर्तित करें क्या? इसके अलावा, किस अर्थ में बेहतर है ?
साइलेंटगॉस्ट

10
2.6 में आप उपयोग नहीं करेंगे simplejson, आप बिल्टिन jsonमॉड्यूल (जिसमें एक ही सटीक इंटरफ़ेस है) का उपयोग करेंगे।
माइक ग्राहम

5
"श्रेष्ठ"? किस लिए श्रेष्ठ? स्पीड? जटिलता? लचीलापन? लागत?
S.Lott


जवाबों:


68

यदि आपके पास कोई इंटरऑपरेबिलिटी आवश्यकताएं नहीं हैं (जैसे कि आप केवल पायथन के साथ डेटा का उपयोग करने जा रहे हैं) और एक द्विआधारी प्रारूप ठीक है, cPickle के साथ जाएं जो आपको वास्तव में तेजी से पायथन ऑब्जेक्ट क्रमांकन देता है।

यदि आप इंटरऑपरेबिलिटी चाहते हैं या आप अपने डेटा को स्टोर करने के लिए एक टेक्स्ट फॉर्मेट चाहते हैं, तो JSON (या आपकी बाधाओं के आधार पर कुछ अन्य उपयुक्त प्रारूप) के साथ जाएं।


48
JSON cPickle की तुलना में तेज़ प्रतीत होता है
मैक

5
मेरा जवाब उन चिंताओं पर प्रकाश डालता है जो मुझे लगता है कि किसी भी समाधान को चुनते समय विचार करना सबसे महत्वपूर्ण है। मैं दूसरे के मुकाबले तेज़ होने का कोई दावा नहीं करता। यदि JSON तेज और अन्यथा उपयुक्त है, तो JSON के साथ जाएं! (यानी, आपके डाउन-वोट का कोई कारण नहीं है।)
हेवार्ड एस

10
मेरा कहना है: JSON पर आपके परिसर के आधार पर cPickle(या pickle) का उपयोग करने का कोई वास्तविक कारण नहीं है । जब मैंने पहली बार आपका जवाब पढ़ा तो मुझे लगा कि इसका कारण गति हो सकता है, लेकिन चूंकि यह मामला नहीं है ... :)
मैक

14
@Mac द्वारा उद्धृत बेंचमार्क केवल तारों का परीक्षण करता है। मैंने स्ट्रैच, इंट और फ्लोट का परीक्षण किया और पता चला कि जसन फ्लोट सीरियलाइज़ेशन के साथ cPickle की तुलना में धीमा है, लेकिन फ्लोट अनसेरीलाइज़ेशन के साथ तेज़ है। Int (और str) के लिए, json दोनों तरीकों से तेज है। डेटा और कोड: gist.github.com/marians/f1314446b8bf4d34e782
Marian

24
CPickle का नवीनतम प्रोटोकॉल अब JSON से अधिक तेज़ है। JSON के बारे में अप-मतदान टिप्पणी कुछ साल पुरानी है। stackoverflow.com/a/39607169/1007353
JDiMatteo

104

मैं अपने क्रमांकन के लिए अचार पर JSON पसंद करता हूं। अनपैकिंग मनमाना कोड चला सकता है, और pickleप्रोग्राम के बीच डेटा ट्रांसफर करने या सत्र के बीच डेटा स्टोर करने के लिए उपयोग करना एक सुरक्षा छेद है। JSON एक सुरक्षा छेद का परिचय नहीं देता है और इसे मानकीकृत किया जाता है, इसलिए यदि आप कभी भी आवश्यकता हो तो डेटा को विभिन्न भाषाओं में प्रोग्राम द्वारा एक्सेस किया जा सकता है।


धन्यवाद। वैसे भी मैं एक ही कार्यक्रम में डंपिंग और लोडिंग कर रहा हूँ।
जुआनजो कोंटी

2
यद्यपि आपके वर्तमान एप्लिकेशन में सुरक्षा जोखिम कम हो सकते हैं, JSON आपको पूरी तरह से बंद करने की अनुमति देता है।
माइक ग्राहम

4
एक अचार-वायरस बना सकता है जो खुद को अचार के रूप में लोड होने के बाद हर चीज में मिला देता है। Json के साथ यह संभव नहीं है।
यूजर

2
सुरक्षा के अलावा, JSON का अतिरिक्त लाभ है कि यह माइग्रेशन को आसान बनाता है, इसलिए आप अपने एप्लिकेशन के पुराने संस्करण द्वारा सहेजे गए डेटा को लोड कर सकते हैं। इस बीच आप एक क्षेत्र जोड़ सकते हैं, या एक पूरे उप संरचना को बदल सकते हैं। तानाशाह / सूची के लिए इस तरह के एक कनवर्टर (माइग्रेशन) को लिखना सीधे आगे है, लेकिन अचार के साथ आपको इसे पहले स्थान पर लोड करने में कठिन समय लगेगा, इससे पहले कि आप इसे बदलने के बारे में भी सोच सकें।
वोग

2
मैंने इस पहलू के बारे में नहीं सोचा था (सुरक्षा और मनमाने ढंग से कोड चलाने के लिए मसालेदार वस्तुओं की क्षमता)। यह बात बताने के लिए धन्यवाद!
कैफीनमेडाइक जूल

43

आपको यह दिलचस्प भी लग सकता है, तुलना करने के लिए कुछ चार्ट के साथ: http://kovshenin.com/archives/pickle-vs-json-which-is-faster/


1
लेख केवल तार से संबंधित प्रदर्शन की तुलना करता है। यहाँ एक स्क्रिप्ट है जिसे आप स्ट्रिंग्स, फ़्लोट्स और सिट्स
Marian


20

यदि आप मुख्य रूप से गति और स्थान से संबंधित हैं, तो cPickle का उपयोग करें क्योंकि CPickle JSON से अधिक तेज़ है।

यदि आप इंटरऑपरेबिलिटी, सुरक्षा और / या मानव पठनीयता से अधिक चिंतित हैं, तो JSON का उपयोग करें।


अन्य उत्तरों में संदर्भित परीक्षण परिणाम 2010 में दर्ज किए गए थे, और 2016 में अद्यतन परीक्षण cPickle प्रोटोकॉल 2 शो के साथ:

  • cPickle 3.8x तेज़ी से लोड हो रहा है
  • cPickle 1.5x तेजी से पढ़ना
  • cPickle थोड़ी छोटी एन्कोडिंग

इस जिस्ट के साथ अपने आप को फिर से तैयार करें , जो अन्य उत्तरों में संदर्भित कॉन्स्टेंटिन के बेंचमार्क पर आधारित है, लेकिन अचार के बजाय प्रोटोकॉल 2 के साथ cPickle का उपयोग करना, और सिम्पसन के बजाय json का उपयोग करना (क्योंकि json सिम्पसन से तेज है ), उदा।

wget https://gist.github.com/jdimatteo/af317ef24ccf1b3fa91f4399902bb534/raw/03e8dbab11b5605bc572bc117c8ac34cfa959a70/pickle_vs_json.py
python pickle_vs_json.py

एक अच्छा 2015 Xeon प्रोसेसर पर अजगर 2.7 के साथ परिणाम:

Dir Entries Method  Time    Length

dump    10  JSON    0.017   1484510
load    10  JSON    0.375   -
dump    10  Pickle  0.011   1428790
load    10  Pickle  0.098   -
dump    20  JSON    0.036   2969020
load    20  JSON    1.498   -
dump    20  Pickle  0.022   2857580
load    20  Pickle  0.394   -
dump    50  JSON    0.079   7422550
load    50  JSON    9.485   -
dump    50  Pickle  0.055   7143950
load    50  Pickle  2.518   -
dump    100 JSON    0.165   14845100
load    100 JSON    37.730  -
dump    100 Pickle  0.107   14287900
load    100 Pickle  9.907   -

अचार प्रोटोकॉल 3 के साथ पायथन 3.4 और भी तेज है।


11

JSON या अचार? कैसे JSON और अचार के बारे में ! आप उपयोग कर सकते हैं jsonpickle। इसका उपयोग करना आसान है और डिस्क पर फ़ाइल पठनीय है क्योंकि यह JSON है।

http://jsonpickle.github.com/


2
किसी ने भी बेंचमार्क किया है यह विकल्पों के खिलाफ प्रदर्शन है? क्या यह कच्चे जोंस के प्रदर्शन के रूप में तुलनीय है जैसा कि यहाँ देखा गया है benfrederickson.com/dont-pickle-your-data ?
जोसेफ वॉल्स

यह एक विस्तृत बेंचमार्क नहीं है, लेकिन मेरे पास एक मौजूदा गेम था जहां यह अचार (पायथन 3) का उपयोग करके स्तरों को बचा रहा था। मैं मानव पठनीय पहलू के लिए jsonpickle आज़माना चाहता था - हालाँकि स्तर की बचत दुखद रूप से बहुत धीमी थी। जोंसपिकल के लिए 1597ms और 88ms या स्तर पर नियमित अचार बचाएं। स्तर लोड के लिए, jsonpickle के लिए 1604ms और अचार के लिए 388। दया आती है जैसे मुझे मानव पठनीय बचता है।
नील मैकगिल

मैंने अपने ट्रेडिंग सिस्टम में इसका परीक्षण किया, अचार अचार की तुलना में 2x सीरीज़ + डिसेरिएलाइज़ेशन स्पीड पेनल्टी के साथ आता है। कुछ और के लिए महान, यद्यपि।
nurettin

6

मैंने कई तरीकों की कोशिश की है और पाया है कि डंप विधि के प्रोटोकॉल तर्क को स्थापित करने के साथ cPickle का उपयोग करना है: cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)सबसे तेज़ डंप विधि है।

import msgpack
import json
import pickle
import timeit
import cPickle
import numpy as np

num_tests = 10

obj = np.random.normal(0.5, 1, [240, 320, 3])

command = 'pickle.dumps(obj)'
setup = 'from __main__ import pickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("pickle:  %f seconds" % result)

command = 'cPickle.dumps(obj)'
setup = 'from __main__ import cPickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("cPickle:   %f seconds" % result)


command = 'cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)'
setup = 'from __main__ import cPickle, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("cPickle highest:   %f seconds" % result)

command = 'json.dumps(obj.tolist())'
setup = 'from __main__ import json, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("json:   %f seconds" % result)


command = 'msgpack.packb(obj.tolist())'
setup = 'from __main__ import msgpack, obj'
result = timeit.timeit(command, setup=setup, number=num_tests)
print("msgpack:   %f seconds" % result)

आउटपुट:

pickle         :   0.847938 seconds
cPickle        :   0.810384 seconds
cPickle highest:   0.004283 seconds
json           :   1.769215 seconds
msgpack        :   0.270886 seconds

4

व्यक्तिगत रूप से, मैं आमतौर पर JSON को पसंद करता हूं क्योंकि डेटा मानव-पठनीय है । निश्चित रूप से, यदि आपको अचार का उपयोग करने की तुलना में JSON नहीं लेना होगा, तो कुछ को क्रमबद्ध करना होगा।

लेकिन अधिकांश डेटा स्टोरेज के लिए, आपको कुछ भी अजीब नहीं करना पड़ेगा और JSON बहुत आसान है और हमेशा आपको टेक्स्ट एडिटर में इसे खोलने और स्वयं डेटा की जांच करने की अनुमति देता है।

गति अच्छी है, लेकिन अधिकांश डेटासेट के लिए अंतर नगण्य है; पायथन आम तौर पर वैसे भी बहुत तेज़ नहीं है।



1
सच। लेकिन 100एक सूची में तत्वों के लिए, अंतर पूरी तरह से मानव आंख के लिए नगण्य है। बड़े डेटासेट के साथ काम करते समय निश्चित रूप से अलग।
rickcnagy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.