2009-04-01 13 views
40

मैं JSON फ़ाइलों को लोड और डीकोड करने के लिए Python 2.6 में json मॉड्यूल का उपयोग कर रहा हूं। हालांकि मैं वर्तमान में अपेक्षित प्रदर्शन से धीमा हो रहा हूं। मैं एक टेस्ट केस का उपयोग कर रहा हूं जो आकार में 6 एमबी है और json.loads() 20 सेकंड ले रहा है।पायथन JSON डिकोडिंग प्रदर्शन

मुझे लगा कि json मॉड्यूल में डीकोडिंग को गति देने के लिए कुछ मूल कोड था?

मैं कैसे जांचूं कि यह उपयोग किया जा रहा है या नहीं?

तुलना के रूप में, मैंने python-cjson मॉड्यूल को डाउनलोड और स्थापित किया, और cjson.decode() उसी परीक्षण मामले के लिए 1 सेकंड ले रहा है।

मैं पाइथन 2.6 के साथ प्रदान किए गए JSON मॉड्यूल का उपयोग करना चाहता हूं ताकि मेरे कोड के उपयोगकर्ताओं को अतिरिक्त मॉड्यूल स्थापित करने की आवश्यकता न हो।

(मैं मैक ओएस एक्स पर विकासशील हूँ, लेकिन मैं Windows XP पर एक समान परिणाम प्राप्त करने।)

+1

यह पायथन 2.7 में हल किया गया है, [टॉमस] (http://stackoverflow.com/users/362757/tomas), Ivo, TONy.W से तुलना संख्याओं के अनुसार। इस पायथन-2.6 – smci

+0

टैग किया गया (प्रति TONY.W की संख्या, शेष एकमात्र मुद्दा यह है कि stdlib json ** एन्कोड ** अभी भी 2x धीमी है 2.7) – smci

उत्तर

18

यह मंच से भिन्न हो सकते हैं, लेकिन अंतर्निहित json मॉड्यूल simplejson पर आधारित है, सी speedups शामिल नहीं है। मुझे सरलजनन को पाइथन-सीजेसन के रूप में तेज़ होने के लिए मिला है, इसलिए मैं इसे पसंद करता हूं क्योंकि यह स्पष्ट रूप से बिल्टिन के समान इंटरफ़ेस है।

try: 
    import simplejson as json 
except ImportError: 
    import json 

मुझे लगता है कि थोड़ी देर के लिए सबसे अच्छा मुहावरे है, जो आगे-संगत होने पर उपलब्ध होने पर प्रदर्शन प्रदान करता है।

+0

fwiw, 11nov 2009 http://pypi.python.org/packages/source/s/simplejson/simplejson-2.0.9.tar.gz मैक 10.4.11 पीपीसी पर, जीसीसी 4.2.1 => simplejson/_speedups.c: 2256: त्रुटि: 'PyTypeObject PyEncoderType' का पुनर्वितरण चेतावनी: सी एक्सटेंशन संकलित नहीं किया जा सका, speedups सक्षम नहीं हैं। – denis

+1

यदि 'पाय-यजिल' और 'अल्ट्राज़सन' तेज हैं, तो 'जेसन' के समान दिखने और शुद्ध पायथन होने के अलावा 'सरलजसन' का उपयोग करने का क्या फायदा है? –

+0

@ शूराने न तो 'पी-यजल' और न ही 'अल्ट्राज़सन' उन सभी तर्कों का समर्थन करते हैं जो 'जेसन' करते हैं। 'simplejson'' json' से अधिक है (सी स्पीडअप के कारण) और एक ड्रॉप-इन प्रतिस्थापन। –

2

खिड़कियों पर अजगर 2.6.1 के अपने स्थापना में देख रहे हैं, json पैकेज _json मॉड्यूल, लोड करता है जो रनटाइम में बनाया गया है। Cjson speedups मॉड्यूल के लिए स्रोत here है।

>>> import _json 
>>> _json 
<module '_json' (built-in)> 
>>> print _json.__doc__ 
json speedups 
>>> dir(_json) 
['__doc__', '__name__', '__package__', 'encode_basestring_ascii', 'scanstring'] 
>>> 
+0

मैंने यह भी माना कि _son के साथ जेसन तेजी से होगा। एक बेंचमार्क ने मुझे गलत साबित कर दिया। –

+1

'json' पैकेज * हुड * पहले से * '_json' सी मॉड्यूल * का उपयोग करता है। इसे सीधे एक्सेस करने में बहुत कम उपयोग है। –

1

भले ही _json उपलब्ध है, मैंने देखा है कि जेसन डीकोडिंग सीपीथन 2.6.6 पर बहुत धीमी है। मैंने अन्य कार्यान्वयन के साथ तुलना नहीं की है, लेकिन प्रदर्शन-महत्वपूर्ण लूप के अंदर मैंने स्ट्रिंग मैनिपुलेशन पर स्विच किया है।

24

नया Yajl - Yet Another JSON Library बहुत तेज़ है।

yajl  serialize: 0.180 deserialize: 0.182 total: 0.362 
simplejson serialize: 0.840 deserialize: 0.490 total: 1.331 
stdlib json serialize: 2.812 deserialize: 8.725 total: 11.537 

आप compare the libraries yourself कर सकते हैं।

अद्यतन:UltraJSON और भी तेज है।

+1

यूजसन लिंक के लिए धन्यवाद;) यह मुझे मेरे gevent/redis खोज सेवा पर एक अतिरिक्त 400 req/sec दिया। – Justin

+0

मैंने खुद परीक्षण की कोशिश की और बहुत प्रतिस्पर्धी परिणाम प्राप्त किए। 20x स्पीडअप बिल्कुल नहीं मिला। तुलना स्क्रिप्ट का उपयोग (प्रदान किए गए लिंक से) और बड़े JSON (20MB) - अभी भी बहुत तुलनीय प्रदर्शन। – Tomas

16

मैं उसी फ़ाइल को 10x पार्स कर रहा था। फ़ाइल का आकार 1,856, 9 44 बाइट था।

अजगर 2.6:

yajl  serialize: 0.294 deserialize: 0.334 total: 0.627 
cjson  serialize: 0.494 deserialize: 0.276 total: 0.769 
simplejson serialize: 0.554 deserialize: 0.268 total: 0.823 
stdlib json serialize: 3.917 deserialize: 17.508 total: 21.425 

अजगर 2.7:

yajl  serialize: 0.289 deserialize: 0.312 total: 0.601 
cjson  serialize: 0.232 deserialize: 0.254 total: 0.486 
simplejson serialize: 0.288 deserialize: 0.253 total: 0.540 
stdlib json serialize: 0.273 deserialize: 0.256 total: 0.528 

सुनिश्चित नहीं हैं कि क्यों संख्या आपके परिणामों से आय से अधिक कर रहे हैं। मुझे लगता है, नए पुस्तकालय?

मंच: ओएस एक्स 10.8.3 MBP 2.2 GHz इंटेल कोर i7

JSON:

simplejson:

+1

मुझे पायथन 2.6 और 2.7 के बीच stdlib (यानी अंतर्निर्मित) जेसन का महत्वपूर्ण प्रदर्शन अंतर भी दिखाई देता है। तो यह एक और कारण है कि Python 2.7 2.6 से अधिक पसंद किया जाता है। – RayLuo

+4

कारण सरल है: जेसन के लिए सी स्पीडअप पायथन 2.7 में जोड़ा गया था। रिलीज नोट्स से: "अपडेटेड मॉड्यूल: जेसन मॉड्यूल को संस्करण 2.0 में अपग्रेड किया गया था।9 सरलजेसन पैकेज में, जिसमें एक सी एक्सटेंशन शामिल है जो एन्कोडिंग और डिकोडिंग को तेज़ी से बनाता है। "Http://docs.python.org/dev/whatsnew/2.7.html –

+2

+1 बेहद मूल्यवान संख्या टॉमस। तो 2.7 सबकुछ ठीक करता है। – smci

13

एक नज़र UltraJSON https://github.com/esnme/ultrajson

यहाँ

अपने परीक्षण (https://gist.github.com/lightcatcher/1136415 से कोड) ले == 3.1.0

पायथन-सीजेसन == 1.0.5

jsonlib == 1.6.1

ujson == 1.30

yajl == 0.3.5

JSON Benchmark 
2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] 
----------------------------- 
ENCODING 
simplejson: 0.293394s 
cjson: 0.461517s 
ujson: 0.222278s 
jsonlib: 0.428641s 
json: 0.759091s 
yajl: 0.388836s 

DECODING 
simplejson: 0.556367s 
cjson: 0.42649s 
ujson: 0.212396s 
jsonlib: 0.265861s 
json: 0.365553s 
yajl: 0.361718s 
+1

का उपयोग कर अगस्त 2014 तक, ये परिणाम नवीनतम लाइब्रेरी संस्करणों पर अधिक सटीक हैं। हमने अपने कुछ यादृच्छिक डेटा और यूज़सन के खिलाफ परीक्षण किया है (लगभग 5-10%) सीजेसन को बाहर करता है जो एक्स 2 सिंपलसन और 3 एक्स जेसन के बारे में है। सीजेसन प्रदर्शन डेटा के विशेष सेट पर भी काफी अस्थिर है, इसलिए हम यूज़सन के साथ चिपके हुए हैं। –

2

जो लोग एक अनुरोध से उत्पादन को पार्स कर रहे हैं अनुरोध पैकेज का उपयोग के लिए, उदाहरण के लिए:

res = requests.request(...) 

text = json.loads(res.text) 

यह मेरी प्रतिक्रिया 2017 मैकबुक पर 6 एमबी के लिए ~ 45 सेकंड का कहना है, यह बड़ी प्रतिक्रिया सामग्री के लिए बहुत धीमा हो सकता है। यह एक धीमी जेसन पार्सर के कारण नहीं है, बल्कि इसके बजाय res.text कॉल द्वारा धीमे चरित्र सेट निर्धारण द्वारा निर्धारित किया जाता है।

आप (भी here देखें) वर्ण सेट इससे पहले कि आप res.text बुला रहे हैं की स्थापना, और cchardet पैकेज का उपयोग करके इस का समाधान कर सकते हैं:

if res.encoding is None: 
    res.encoding = cchardet.detect(res.content)['encoding'] 

यह प्रतिक्रिया पाठ json लगभग तुरंत पार्स करने में आता है !

संबंधित मुद्दे