मैंने स्टैंडर्ड लाइब्रेरी से simplejson
मॉड्यूल के बजाय मॉड्यूल का उपयोग करते हुए कई प्रोजेक्ट देखे हैं json
। इसके अलावा, कई अलग-अलग simplejson
मॉड्यूल हैं। मानक पुस्तकालय में एक के बजाय, इन विकल्पों का उपयोग क्यों किया जाएगा?
मैंने स्टैंडर्ड लाइब्रेरी से simplejson
मॉड्यूल के बजाय मॉड्यूल का उपयोग करते हुए कई प्रोजेक्ट देखे हैं json
। इसके अलावा, कई अलग-अलग simplejson
मॉड्यूल हैं। मानक पुस्तकालय में एक के बजाय, इन विकल्पों का उपयोग क्यों किया जाएगा?
जवाबों:
json
है simplejson
, stdlib में जोड़ा जाता है। लेकिन चूंकि json
2.6 में जोड़ा गया था, इसलिए simplejson
अधिक पायथन संस्करणों (2.4+) पर काम करने का फायदा है।
simplejson
पायथन की तुलना में अधिक बार अपडेट किया जाता है, इसलिए यदि आपको नवीनतम संस्करण की आवश्यकता है (या चाहते हैं), तो इसका उपयोग करना सबसे अच्छा simplejson
है, यदि संभव हो तो।
एक अच्छा अभ्यास, मेरी राय में, एक या दूसरे को कमबैक के रूप में उपयोग करना है।
try:
import simplejson as json
except ImportError:
import json
JSONDecodeError
एक उपवर्ग हैValueError
मुझे अन्य उत्तरों से असहमत होना होगा: json
लाइब्रेरी में बनाया गया (पायथन 2.7 में) जरूरी से ज्यादा धीमा नहीं है simplejson
। यह भी इस कष्टप्रद यूनिकोड बग नहीं है ।
यहाँ एक सरल बेंचमार्क है:
import json
import simplejson
from timeit import repeat
NUMBER = 100000
REPEAT = 10
def compare_json_and_simplejson(data):
"""Compare json and simplejson - dumps and loads"""
compare_json_and_simplejson.data = data
compare_json_and_simplejson.dump = json.dumps(data)
assert json.dumps(data) == simplejson.dumps(data)
result = min(repeat("json.dumps(compare_json_and_simplejson.data)", "from __main__ import json, compare_json_and_simplejson",
repeat = REPEAT, number = NUMBER))
print " json dumps {} seconds".format(result)
result = min(repeat("simplejson.dumps(compare_json_and_simplejson.data)", "from __main__ import simplejson, compare_json_and_simplejson",
repeat = REPEAT, number = NUMBER))
print "simplejson dumps {} seconds".format(result)
assert json.loads(compare_json_and_simplejson.dump) == data
result = min(repeat("json.loads(compare_json_and_simplejson.dump)", "from __main__ import json, compare_json_and_simplejson",
repeat = REPEAT, number = NUMBER))
print " json loads {} seconds".format(result)
result = min(repeat("simplejson.loads(compare_json_and_simplejson.dump)", "from __main__ import simplejson, compare_json_and_simplejson",
repeat = REPEAT, number = NUMBER))
print "simplejson loads {} seconds".format(result)
print "Complex real world data:"
COMPLEX_DATA = {'status': 1, 'timestamp': 1362323499.23, 'site_code': 'testing123', 'remote_address': '212.179.220.18', 'input_text': u'ny monday for less than \u20aa123', 'locale_value': 'UK', 'eva_version': 'v1.0.3286', 'message': 'Successful Parse', 'muuid1': '11e2-8414-a5e9e0fd-95a6-12313913cc26', 'api_reply': {"api_reply": {"Money": {"Currency": "ILS", "Amount": "123", "Restriction": "Less"}, "ProcessedText": "ny monday for less than \\u20aa123", "Locations": [{"Index": 0, "Derived From": "Default", "Home": "Default", "Departure": {"Date": "2013-03-04"}, "Next": 10}, {"Arrival": {"Date": "2013-03-04", "Calculated": True}, "Index": 10, "All Airports Code": "NYC", "Airports": "EWR,JFK,LGA,PHL", "Name": "New York City, New York, United States (GID=5128581)", "Latitude": 40.71427, "Country": "US", "Type": "City", "Geoid": 5128581, "Longitude": -74.00597}]}}}
compare_json_and_simplejson(COMPLEX_DATA)
print "\nSimple data:"
SIMPLE_DATA = [1, 2, 3, "asasd", {'a':'b'}]
compare_json_and_simplejson(SIMPLE_DATA)
और मेरे सिस्टम पर परिणाम (पायथन 2.7.4, लिनक्स 64-बिट):
जटिल वास्तविक विश्व डेटा:
जसन 1.56666707993 सेकंड का
सिंपलसन डंप 2.25638604164 सेकंड्स का
जोंस लोड 2.71256899834 सेकंड
सिंपलसन का लोड 1.29233884811 सेकंडसरल डेटा:
json dumps 0.370109081268 सेकंड्स
simplejson dumps 0.574181079865 सेकंड्स
json लोड 0.422876119614 सेकंड
simplejson लोड 0.270955085754 सेकंड
डंपिंग के लिए, json
की तुलना में तेज है simplejson
। लोडिंग के लिए, simplejson
तेज है।
चूंकि मैं वर्तमान में एक वेब सेवा का निर्माण कर रहा हूं, dumps()
यह अधिक महत्वपूर्ण है- और एक मानक पुस्तकालय का उपयोग करना हमेशा पसंद किया जाता है।
इसके अलावा, cjson
पिछले 4 वर्षों में अपडेट नहीं किया गया था, इसलिए मैं इसे नहीं छूऊंगा।
json
(CPython 3.5.0) 68% है। सरल पर 45% तेज | जटिल डंप और 35% | सरल पर 17% | जटिल भार wr3 simplejson
v3.8.0 के साथ C स्पीडअप अपने बेंचमार्क कोड का उपयोग करते हुए। इसलिए, मैं इस सेटअप के साथ अब सिंपलसन का उपयोग नहीं करूंगा।
json
जीत या सभी परीक्षणों के लिए समान है। वास्तव json
में जटिल वास्तविक दुनिया डेटा डंप परीक्षण के रूप में तेजी से दो बार के तहत एक छोटा सा है!
ये सभी उत्तर बहुत उपयोगी नहीं हैं क्योंकि वे समय के प्रति संवेदनशील हैं ।
अपने खुद के कुछ शोध करने के बाद मैंने पाया कि simplejson
वास्तव में बिलिन से तेज है, अगर आप इसे नवीनतम संस्करण में अपडेट करते हैं।
pip/easy_install
ubuntu 12.04 पर 2.3.2 स्थापित करना चाहता था, लेकिन नवीनतम simplejson
संस्करण का पता लगाने के बाद वास्तव में 3.3.0 है, इसलिए मैंने इसे अपडेट किया और समय परीक्षण फिर से शुरू किया।
simplejson
json
भार पर बिलिन की तुलना में लगभग 3x तेज हैsimplejson
json
डंप पर बिलिन की तुलना में लगभग 30% तेज हैउपरोक्त कथन अजगर -२. statements.३ और सिंपलिसन ३.३.० (सी स्पीडअप के साथ) में हैं और यह सुनिश्चित करने के लिए कि मेरा उत्तर भी समय के प्रति संवेदनशील नहीं है, आपको यह जाँचने के लिए अपने परीक्षण चलाने चाहिए क्योंकि यह संस्करणों के बीच बहुत भिन्न होता है; कोई आसान जवाब नहीं है जो समय के प्रति संवेदनशील नहीं है।
import simplejson
# If this is True, then c speedups are enabled.
print bool(getattr(simplejson, '_speedups', False))
अद्यतन: मैं हाल ही में ujson नामक एक पुस्तकालय में आया था जो simplejson
कुछ बुनियादी परीक्षणों की तुलना में ~ 3x तेज प्रदर्शन कर रहा है ।
मैं json, simplejson और cjson बेंचमार्किंग कर रहा हूं।
$ python test_serialization_speed.py
--------------------
Encoding Tests
--------------------
Encoding: 100000 x {'m': 'asdsasdqwqw', 't': 3}
[ json] 1.12385 seconds for 100000 runs. avg: 0.011239ms
[simplejson] 0.44356 seconds for 100000 runs. avg: 0.004436ms
[ cjson] 0.09593 seconds for 100000 runs. avg: 0.000959ms
Encoding: 10000 x {'m': [['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19], ['0', 1, '2', 3, '4', 5, '6', 7, '8', 9, '10', 11, '12', 13, '14', 15, '16', 17, '18', 19]], 't': 3}
[ json] 7.76628 seconds for 10000 runs. avg: 0.776628ms
[simplejson] 0.51179 seconds for 10000 runs. avg: 0.051179ms
[ cjson] 0.44362 seconds for 10000 runs. avg: 0.044362ms
--------------------
Decoding Tests
--------------------
Decoding: 100000 x {"m": "asdsasdqwqw", "t": 3}
[ json] 3.32861 seconds for 100000 runs. avg: 0.033286ms
[simplejson] 0.37164 seconds for 100000 runs. avg: 0.003716ms
[ cjson] 0.03893 seconds for 100000 runs. avg: 0.000389ms
Decoding: 10000 x {"m": [["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19], ["0", 1, "2", 3, "4", 5, "6", 7, "8", 9, "10", 11, "12", 13, "14", 15, "16", 17, "18", 19]], "t": 3}
[ json] 37.26270 seconds for 10000 runs. avg: 3.726270ms
[simplejson] 0.56643 seconds for 10000 runs. avg: 0.056643ms
[ cjson] 0.33007 seconds for 10000 runs. avg: 0.033007ms
कुछ मूल्यों को सिंपलसन और जोंस के बीच अलग-अलग क्रमबद्ध किया जाता है।
विशेष रूप से, उदाहरणों collections.namedtuple
को सरणियों के रूप में json
लेकिन द्वारा वस्तुओं के रूप में क्रमबद्ध किया जाता है simplejson
। आप पारित करके इस व्यवहार को ओवरराइड कर सकते हैं namedtuple_as_object=False
करने के लिए simplejson.dump
है, लेकिन डिफ़ॉल्ट रूप से व्यवहार से मेल नहीं खाते।
>>> import collections, simplejson, json
>>> TupleClass = collections.namedtuple("TupleClass", ("a", "b"))
>>> value = TupleClass(1, 2)
>>> json.dumps(value)
'[1, 2]'
>>> simplejson.dumps(value)
'{"a": 1, "b": 2}'
>>> simplejson.dumps(value, namedtuple_as_object=False)
'[1, 2]'
एक एपीआई असंगति मुझे मिली, पायथन 2.7 बनाम सिंपलजसन 3.3.1 के साथ है कि क्या आउटपुट स्ट्रोड या यूनिकोड ऑब्जेक्ट का उत्पादन करता है। जैसे
>>> from json import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode("""{ "a":"b" }""")
{u'a': u'b'}
बनाम
>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode("""{ "a":"b" }""")
{'a': 'b'}
यदि वरीयता सिंपलजसन का उपयोग करने की है, तो इसे यूनिकोड में तर्क स्ट्रिंग के साथ जोड़कर संबोधित किया जा सकता है, जैसे कि:
>>> from simplejson import JSONDecoder
>>> jd = JSONDecoder()
>>> jd.decode(unicode("""{ "a":"b" }""", "utf-8"))
{u'a': u'b'}
उदाहरण के लिए जबरदस्ती के लिए मूल चरक जानना आवश्यक है:
>>> jd.decode(unicode("""{ "a": "ξηθννββωφρες" }"""))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 8: ordinal not in range(128)
यह समस्या 40 को ठीक नहीं करेगा
यहाँ है (अब एक पुराना) पायथन जसन पुस्तकालयों की तुलना:
पायथन के लिए JSON मॉड्यूल की तुलना ( संग्रह लिंक )
इस तुलना में परिणाम के बावजूद, यदि आप पायथन 2.6 पर हैं, तो आपको मानक लाइब्रेरी जोंस का उपयोग करना चाहिए। और .. के रूप में अच्छी तरह से सिर्फ simplejson अन्यथा का उपयोग कर सकते हैं।
सिंपलसन मॉड्यूल जोंस की तुलना में केवल 1,5 गुना तेज है (मेरे कंप्यूटर पर, सिंपलसन 2.1.1 और पायथन 2.7 x86 के साथ)।
यदि आप चाहते हैं, तो आप बेंचमार्क आज़मा सकते हैं: http://abral.altervista.org/jsonpickle-bench.zip मेरे पीसी पर सिंपलसन cPickle से अधिक तेज़ है। मैं आपके बेंचमार्क भी जानना चाहूंगा!
शायद, जैसा कि कहा जाता है, कोअडी, सिम्पसन और जोंस के बीच का अंतर यह है कि सिंपलसन में _speedups.c शामिल है। तो, अजगर डेवलपर्स simplejson का उपयोग क्यों नहीं करते हैं?
Python3 में, यदि आप इसे लोड करने से पहले सामग्री के b'bytes'
साथ, json
आपके पास एक स्ट्रिंग .decode()
है। simplejson
इस का ध्यान रखता है ताकि आप बस कर सकें simplejson.loads(byte_string)
।
json
simplejson
नवीनतम संस्करण में लोड और डंप दोनों के मामलों की तुलना में तेज़ी से लगता है
परीक्षण किए गए संस्करण:
परिणाम:
>>> def test(obj, call, data, times):
... s = datetime.now()
... print("calling: ", call, " in ", obj, " ", times, " times")
... for _ in range(times):
... r = getattr(obj, call)(data)
... e = datetime.now()
... print("total time: ", str(e-s))
... return r
>>> test(json, "dumps", data, 10000)
calling: dumps in <module 'json' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\json\\__init__.py'> 10000 times
total time: 0:00:00.054857
>>> test(simplejson, "dumps", data, 10000)
calling: dumps in <module 'simplejson' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\simplejson\\__init__.py'> 10000 times
total time: 0:00:00.419895
'{"1": 100, "2": "acs", "3.5": 3.5567, "d": [1, "23"], "e": {"a": "A"}}'
>>> test(json, "loads", strdata, 1000)
calling: loads in <module 'json' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\json\\__init__.py'> 1000 times
total time: 0:00:00.004985
{'1': 100, '2': 'acs', '3.5': 3.5567, 'd': [1, '23'], 'e': {'a': 'A'}}
>>> test(simplejson, "loads", strdata, 1000)
calling: loads in <module 'simplejson' from 'C:\\Users\\jophine.antony\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages\\simplejson\\__init__.py'> 1000 times
total time: 0:00:00.040890
{'1': 100, '2': 'acs', '3.5': 3.5567, 'd': [1, '23'], 'e': {'a': 'A'}}
संस्करणों के लिए:
डंप ऑपरेशन के दौरान जसन सिंपलसन की तुलना में तेज था, लेकिन दोनों ने लोड संचालन के दौरान समान गति बनाए रखी
मुझे इस सवाल का पता चला क्योंकि मैं पाइथन 2.6 के लिए सिंपलसन स्थापित करना चाह रहा था। मुझे json.load () के 'object_pairs_hook' का उपयोग करने की आवश्यकता थी ताकि ऑर्डर की गई डिक्शनरी के रूप में एक json फाइल लोड की जा सके। पायथन के अधिक हाल के संस्करणों से परिचित होने के कारण मुझे यह महसूस नहीं हुआ कि पायथन 2.6 के लिए json मॉड्यूल में 'object_pairs_hook' शामिल नहीं है, इसलिए मुझे इस उद्देश्य के लिए सिम्पसन को स्थापित करना पड़ा। व्यक्तिगत अनुभव से यही कारण है कि मैं मानक जोन मॉड्यूल के विपरीत सिम्पसन का उपयोग करता हूं।
redefinition of unused 'json'