2015-01-26 5 views
5

मैं कुछ एक्सएमएल (कुछ पायथन 3.4 कोड के साथ) को पार्स कर रहा हूं और दोनों नोड और इसकी आईडी विशेषता से टेक्स्ट पुनर्प्राप्त करना चाहता हूं। उदाहरण: <li id="12345"> Some text here </li> मेरा वर्तमान कोड केवल पाठ के चारों ओर संरचित है (अब मैं आईडी जोड़ रहा हूं, लेकिन इससे पहले इसकी आवश्यकता नहीं थी)। मैं पाठ/वाक्यों की एक सूची के माध्यम से लूपिंग कर रहा हूं, और फिर कुछ सामान करने के लिए आगे बढ़ता हूं। इसलिए मैंने टेक्स्ट/वाक्य के साथ कुंजीपटल बनाने के बारे में सोचा, और यह आईडी मान के रूप में विशेषता है।पायथन शब्दकोश में लंबी (str) कुंजी की दक्षता

हालांकि, यह बहुत ही कुशल नहीं लगता है। टेक्स्ट बहुत लंबा हो सकता है, जिससे कुंजी बहुत लंबी हो जाती है। जबकि आईडी हमेशा एक सीमित लंबाई की होती है (लेकिन अभी भी स्ट्र प्रकार का है, उदाहरण के लिए कुछ अल्फा वर्ण कुछ अंकों के बाद)। लेकिन आईडी को कुंजी और टेक्स्ट बनाने के लिए मूल्य को कोड के कुछ पुनर्लेखन की आवश्यकता होती है। सभी बहुत ही समस्याग्रस्त नहीं हैं, लेकिन यह मुझे आश्चर्यचकित कर रहा है: "ulp_887362487687678" जैसी आईडी की तुलना में कुंजी (संभावित रूप से एक संपूर्ण पैराग्राफ) कुंजी के रूप में कितना अक्षम होगा?

मैं केवल दो रिवर्स शब्दकोश (एक आईडी के रूप में आईडी के साथ, दूसरा कुंजी के रूप में पाठ के साथ) बना सकता हूं और निर्माण और लुकअप और सभी की तुलना कर सकता हूं। और मुझे मुख्य लंबाई सीमा (Do Dictionaries have a key length limit?) पर कुछ विषय भी मिले हैं। लेकिन मैं केवल यह सोच रहा हूं कि इस पर आपके विचार क्या हैं। क्या आपके दिमाग में ऐसी लंबी स्ट्रिंग कुंजी है जो आप निश्चित रूप से टालना चाहते हैं, या यह एक बहुत बड़ा सौदा नहीं है? यदि आप कुछ प्रो/कॉन साझा कर सकते हैं, तो यह बहुत अच्छा होगा!

+0

आप किसी भी समय प्रश्न संपादित कर सकते हैं। –

उत्तर

9

नहीं, पायथन स्ट्रिंग की लंबाई का शब्दकोश प्रदर्शन पर असर पड़ता है। hash() फ़ंक्शन पर स्ट्रिंग लम्बाई का एकमात्र प्रभाव हो सकता है, जिसका उपयोग हैश टेबल स्लॉट की कुंजी को मैप करता है।

>>> import random 
>>> from timeit import timeit 
>>> from string import ascii_letters 
>>> generate_text = lambda len: ''.join([random.choice(ascii_letters) for _ in xrange(len)]) 
>>> for i in range(8): 
...  length = 10 + 10 ** i 
...  testword = generate_text(length) 
...  timing = timeit('hash(t)', 'from __main__ import testword as t') 
...  print 'Length: {}, timing: {}'.format(length, timing) 
... 
Length: 11, timing: 0.061537027359 
Length: 20, timing: 0.0796310901642 
Length: 110, timing: 0.0631730556488 
Length: 1010, timing: 0.0606122016907 
Length: 10010, timing: 0.0613977909088 
Length: 100010, timing: 0.0607581138611 
Length: 1000010, timing: 0.0672461986542 
Length: 10000010, timing: 0.080118894577 

मैं 10 लाख वर्णों की स्ट्रिंग पैदा करने बंद कर दिया, क्योंकि मैं परेशान नहीं किया जा सकता है अपने लैपटॉप एक 100 मिलियन उत्पन्न करने के लिए के लिए इंतजार:

स्ट्रिंग लंबाई hash() के प्रदर्शन पर बहुत कम प्रभाव पड़ता वर्ण स्ट्रिंग।

समय बहुत अधिक स्थिर हैं, क्योंकि गणना वास्तव में गणना की गई स्ट्रिंग ऑब्जेक्ट पर कैश की जाती है।

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