2010-06-11 15 views
11

मैं 10,000,000 वस्तुओं के साथ एक अजगर dict भर रहा हूँ। Dict (या हैशटेबल्स) की मेरी समझ यह है कि जब उनमें बहुत अधिक तत्व होते हैं, आकार बदलने की आवश्यकता होती है, एक ऑपरेशन जो काफी समय तक खर्च करता है।क्या एक पाइथन dict प्रारंभिक क्षमता (और यह उपयोगी है)

वहाँ एक अजगर dict है कि आप इसे में कम से कम n आइटम भंडारण इतना है कि यह शुरू से ही स्मृति आवंटित कर सकते हैं हो जाएगा, करने के लिए कहने के लिए कोई तरीका है? या यह अनुकूलन मेरी चलती गति के लिए अच्छा नहीं करेगा?

(और नहीं, मैंने यह नहीं देखा है कि मेरी छोटी लिपि की धीमी गति इस वजह से है, मैं वास्तव में ऐसा नहीं करूँगा। ऐसा कुछ है जो मैं जावा में करता हूं, प्रारंभिक क्षमता निर्धारित करता हूं HashSet दाएं)

+1

[पाइथन - प्रारंभिक क्षमता के साथ एक सूची बनाएं] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/311775/python-create-a-list-with-initial-capacity) – msw

+7

इससे सहमत न हों डुप्लिकेट हिस्सा। एक सूची एक सूची के समान नहीं है। –

+0

संभव डुप्लिकेट [पायथन में एक शब्दकोश के लिए प्रारंभिक आकार कैसे सेट करें?] (Http://stackoverflow.com/questions/1298636/how-to-set-initial-size-for-a-dictionary-in-python) – psmears

उत्तर

18

सबसे पहले, मैं अफवाह है कि आप प्रारंभ में एक शब्दकोश का आकार सेट कर सकते हैं सुना है, लेकिन मैं किसी भी दस्तावेज या पीईपी यह कैसे किया जा जाएगा का वर्णन कभी नहीं देखा है।

इस के साथ

मन में मैं अपने आइटमों की मात्रा, नीचे वर्णित पर एक विश्लेषण भाग गया। हालांकि प्रत्येक बार शब्दकोश का आकार बदलने में कुछ समय लग सकता है, जब तक कि आप इसके प्रदर्शन की जांच नहीं कर लेते, कम से कम जब तक मैं इसके बारे में चिंता किए बिना आगे बढ़ने की सिफारिश करता हूं।

दो नियमों का निर्धारण करने का आकार बदलने के तत्वों और आकार बदलने के कारक की संख्या है में चिंता का विषय है। एक शब्दकोश का आकार बदल जाएगा जब यह 2/3 अंक पर डालने वाले तत्व के अतिरिक्त 2/3 भरा होगा। 50,000 तत्वों के नीचे यह 4 के कारक से बढ़ेगा, उस राशि के ऊपर 2 के कारक से। 10,000,000 तत्वों (2^23 और 2^24 के बीच) के अपने अनुमान का उपयोग करके आपका शब्दकोश 15 बार (50k से 7 गुना, ऊपर 8 बार)। एक और आकार सिर्फ 11,100,000 होगा।

आकार बदला जा रहा है और hashtable में मौजूदा तत्वों की जगह में कुछ समय लग रहा है, लेकिन मुझे आश्चर्य है अगर आप जो कुछ भी आप पास के कोड में हो रहा है के साथ यह नोटिस चाहते हैं। मैंने बस एक सीमा सूट को प्रत्येक सीमा के साथ पांच स्थानों पर 2^3 से 2^24 के शब्दकोश आकार से सम्मिलित करते हुए, और "सीमा" जोड़ों को "गैर-सीमा" जोड़ों से अधिक औसत 0.4 नैनोसेकंड जोड़ दिया। यह 0.17% लंबा है ... शायद स्वीकार्य है। सभी परिचालनों के लिए न्यूनतम 0.2085 माइक्रोसॉन्ड था, और अधिकतम 0.2412 माइक्रोसॉन्ड था।

आशा इस व्यावहारिक है, और अगर आप अपने कोड के प्रदर्शन की जांच कर अनुवर्ती एक संपादन के साथ कृपया! शब्दकोश internals के लिए मेरे प्राथमिक संसाधन PyCon 2010 ब्रैंडन रोड्स द्वारा दिए गए शानदार बात थी: The Mighty Dictionary

+0

द माटी डिक्शनरी का लिंक अब मृत है (लिंक सड़ांध) –

+0

लिंक फिर से काम करता है। – Celeo

2

हाँ तुम यहाँ और कर सकते हैं एक समाधान मैं किसी अन्य व्यक्ति का सवाल है कि तुम्हारा भी संबंधित है में पाया जाता है:

d = {} 
for i in xrange(4000000): 
d[i] = None 
# 722ms 

d = dict(itertools.izip(xrange(4000000), itertools.repeat(None))) 
# 634ms 

dict.fromkeys(xrange(4000000)) 
# 558ms 

s = set(xrange(4000000)) 
dict.fromkeys(s) 
# Not including set construction 353ms 

एक निश्चित आकार के साथ एक शब्दकोश को शुरू करने के लिए वे अलग-अलग तरीके हैं।

+11

यदि आप किसी और के [उत्तर] (http://stackoverflow.com/a/1298905/12892) का उपयोग कर रहे हैं, तो उसे [http://stackoverflow.com/users/107366/ants-aasma) क्रेडिट दें, खासकर जब उत्तर [सीसी बाय-एस 3.0] के तहत लाइसेंस प्राप्त होते हैं (http://creativecommons.org/licenses/by-sa/3.0/) [एट्रिब्यूशन आवश्यक] के साथ (http://blog.stackoverflow.com/2009/06/रोपण-आवश्यक /)। बिल्ली, आप खुद को बेंचमार्क पुन: उत्पन्न कर सकते थे। –

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