2011-06-15 29 views
7

में फास्ट लुकअप के लिए नामकरण dict कुंजी का नामकरण करने के लिए मुझे 1 छोटा शब्दकोश (5 और 20 कुंजी के बीच) होने वाला है जिसे पाइथन 2.5 में एक पृष्ठ लोड के लिए सौ बार या उससे अधिक संदर्भित किया जाएगा।पाइथन

मैं उन चाबियों का नाम देना शुरू कर रहा हूं जो इसे देखे जा रहे हैं और मैं सोच रहा था कि एक महत्वपूर्ण नामकरण सम्मेलन है जो मैं लुकअप के समय में मदद करने के लिए अनुसरण कर सकता हूं।

+0

आप पूर्णांक कुंजी के साथ क्या कर सकते हैं - वे तार की तुलना में तेजी हो जाएगा। (यदि ऐसा है, तो आप शायद एक सूची का उपयोग कर सकते हैं।) –

+0

@ स्वेन मार्नच, क्या ऐसा है? स्ट्रिंग के मुकाबले हैश फ़ंक्शन पूर्णांक के लिए तेज़ है? यदि ऐसा है तो यह दिलचस्प जानकारी है, क्या आपके पास कोई संदर्भ है? – juanchopanza

+0

@juanchopanza: इंटेजर्स हैश स्वयं (कम से कम उन हैं जो मानों के लिए उपयोग किए गए पूर्णांक प्रकार की सीमा में हैं)। स्ट्रिंग्स को कम से कम एक बार फिर से चालू करना होगा। – delnan

उत्तर

7

मैं का उपयोग कर

  • f1, पूर्णांक कुंजी 1
  • f2 कम स्ट्रिंग, "one"
  • F3 लंबी स्ट्रिंग "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

;-)

परीक्षण करने के लिए एक के रूप में किया था लंबाई के एक शब्दकोश में चाबियाँ 4. 10,000,000 Iterating बार और समय मापने। मैं इस परिणाम मिलता है:

<function f1 at 0xb779187c> 
f1 3.64 
<function f2 at 0xb7791bfc> 
f2 3.48 
<function f3 at 0xb7791bc4> 
f3 3.65 

यानी कोई फर्क नहीं ...

मेरे code

+0

... लेकिन जो मैं देख रहा हूं वह कैशिंग का प्रभाव हो सकता है ... –

+2

तो मूल रूप से मैं इकट्ठा कर रहा हूं ... इसके बारे में चिंता न करें, खासकर ऐसे छोटे से छोटे और लुकअप की कम संख्या के लिए। – adam

2

क्योंकि अजगर स्ट्रिंग वर्ण (कम से कम अगर this अभी भी लागू होता है) से अधिक हैश फंक्शन दोहराता है, मैं कम तार के लिए चुनते चाहते हैं।

+3

यह उन्हें कैश करता है, स्ट्रिंग_शैश (PyStringObject * ए) को [stringobject.c] में देखें (http://svn.python.org/projects/python/trunk/Objects/stringobject.c)। यह हमेशा के लिए हमेशा के लिए किया था। गौर करें कि वह पृष्ठ केवल पाइथन में लिखे गए एल्गोरिदम का विचार देता है, सटीक कार्यान्वयन नहीं। – delnan

+0

@ डेलनान: जानकारी के लिए धन्यवाद, मैं वास्तव में पाइथन आंतरिक में नहीं हूं। लेकिन चूंकि हैश को कम से कम एक बार गणना करना है, कम रूप में यह अभी भी लागू होता है। मैंने तदनुसार संपादित किया। – Waldheinz

+0

यह एक बहुत ही पतला लूप है जो एक आधुनिक कंपाइलर द्वारा संकलित सी में लिखित केवल संख्या क्रंचिंग कर रहा है। एक औसत पुनरावृत्ति कुछ चक्रों से अधिक लेने की संभावना नहीं है। यह वह स्तर है जहां आप किसी भी अंतर को माप नहीं सकते हैं जबतक कि आप दस लाख पुनरावृत्तियों के साथ लाखों लूप चलाते हैं। एक चरित्र को शेविंग करने से शायद कुछ नैनोसेकंड अंतर आएंगे। **बिलकुल**। मुझे नहीं लगता कि यह अच्छी सलाह है। – delnan

6

वहां उनके लिए समझदार नाम हो सकते हैं जो ऐसे नामों का उत्पादन करने के लिए होते हैं जिनके हैंश संघर्ष नहीं कर रहे हैं। हालांकि, ज्ञात ब्रह्मांड में सीपीथन डिक्ट्स पहले से ही सबसे अनुकूलित डेटा संरचनाओं में से एक हैं, अधिकांश इनपुट के लिए कुछ टकराव पैदा कर रहे हैं, अन्य बिल्टिन प्रकारों की हैश योजनाओं के साथ अच्छी तरह से काम कर रहे हैं, तेजी से संघर्ष को हल कर रहे हैं आदि। यह अत्यंत संभावना नहीं है कि आप ' किसी भी को लाभ मिलेगा, भले ही आपको कुछ मिल जाए, खासकर जब से सौ लुकअप वास्तव में बहुत से नहीं हैं। (3.1 गीगा के साथ एक laughablely कम बजट की दोहरी कोर सीपीयू खेल)

उदाहरण के लिए, इस timeit बेंचमार्क मेरी 4 साल पुरानी डेस्कटॉप मशीन पर चलने:

...>python -mtimeit --setup="d = {chr(i)*100: i for i in range(15)};\ 
k = chr(7)*100" "d[k]" 

1000000 loops, best of 3: 0.222 usec per loop 

और उन तार एक दर्जन से अधिक गुना बड़ा है एक वैरिएबल नाम के रूप में मैन्युअल रूप से टाइप करने के लिए दूरस्थ रूप से समझदार सब कुछ की तुलना में। लंबाई को 100 से 10 लीड्स तक घटाकर 0.0778 माइक्रोसॉन्ड प्रति लुकअप। अब अपने पृष्ठ की लोड गति को मापें और उनसे तुलना करें (वैकल्पिक रूप से, केवल सोचें कि पेज बनाने के दौरान आप वास्तव में कितना काम कर रहे हैं); और खाते में कैशिंग, ढांचे के ऊपर, और इन सभी चीजों को ध्यान में रखें।

इस संबंध में आप जो कुछ भी नहीं करते हैं वह प्रदर्शन-वार, अवधि, पूर्ण स्टॉप में अंतर डाल सकता है।

0

पायथन शब्दकोशों में स्ट्रिंग कुंजियों के लिए तेज़ पथ है, इसलिए इन (बजाय, कहें, tuples) का उपयोग करें। एक स्ट्रिंग का हैश मान उस स्ट्रिंग में कैश किया जाता है, इसलिए यह अधिक महत्वपूर्ण है कि स्ट्रिंग्स उनके वास्तविक मूल्य की तुलना में समान रहें; स्ट्रिंग स्थिरांक (यानी, स्ट्रिंग जो प्रोग्राम में वर्बैटिम दिखाई देती हैं और गणना का परिणाम नहीं होती हैं) हमेशा वही रहती हैं, इसलिए जब तक आप उनका उपयोग करते हैं, तो चिंता करने की कोई आवश्यकता नहीं है। समय हैश गणना करने के लिए समग्र समय की एक substancial अंश हो सकता है बहुत छोटा शब्दकोशों और भारी समय की कमी के लिए

,:

1

एक और पहलू को जोड़ने के लिए। इसलिए, 5 तत्वों के लिए (कहें), यह एक सरणी और अनुक्रमिक खोज (निश्चित रूप से, कुछ मिनी डिक्शनरी ऑब्जेक्ट में लपेटा गया) का उपयोग करने के लिए तेज़ हो सकता है, शायद बाइनरी खोज द्वारा भी बढ़ाया जा सकता है। यह 2-3 तुलनाओं वाला तत्व पा सकता है, जो हैश-गणना और एक तुलना की तुलना में तेज़ हो सकता है या नहीं।

ब्रेक-यहां तक ​​कि हैश गति, तत्वों की औसत संख्या और हैश टकराव की संख्या पर निर्भर करता है, इसलिए कुछ माप की आवश्यकता होती है, और कोई "आकार-फिट-सब" उत्तर नहीं होता है।

+1

नहीं यदि वह खोज पायथन में लिखी गई है। – delnan