2012-07-09 13 views
6

संभव डुप्लिकेट:
'has_key()' or 'in'?क्षमता अंतर

अजगर में, वहाँ तय एक key एक dict में है करने के दो तरीके हैं :

if dict.has_key(key) और if key in dict

कोई मुझे बताता है कि दूसरा व्यक्ति in कीवर्ड के बाद से पहले की तुलना में धीमा है, यह अभिव्यक्ति को श्रोताओं पर एक पुनरावृत्ति बनाता है, इसलिए यह has_key विकल्प से धीमा हो जाएगा, जो स्पष्ट रूप से निर्णय लेने के लिए हैश का उपयोग करता है।

जैसा कि मुझे बहुत अंतर है, क्योंकि मुझे लगता है कि पाइथन कीवर्ड को dict से पहले कुछ हैश तरीके से अनुवाद करने के लिए पर्याप्त स्मार्ट है, मुझे इसके बारे में कोई औपचारिक दावा नहीं मिल रहा है।

तो क्या वास्तव में दोनों के बीच कोई दक्षता अंतर है?

धन्यवाद।

उत्तर

8

इन दोनों परिचालन एक ही काम करते हैं: कुंजी के लिए dict में लागू हैश तालिका की जांच करें। न तो पूरे शब्दकोश को फिर से भर देगा। ध्यान रखें कि for x in dictif x in dict से भिन्न है। वे दोनों in कीवर्ड का उपयोग करते हैं, लेकिन विभिन्न परिचालन हैं।

in कीवर्ड dict.__contains__ पर एक कॉल बन जाता है, जो इसे लागू करने के लिए लागू हो सकता है।

यदि इन परिचालनों के समय में कोई अंतर है, तो यह बहुत छोटा होगा, और has_key के फ़ंक्शन कॉल ओवरहेड के साथ करना होगा।

बीटीडब्ल्यू, सामान्य प्राथमिकता key in dictdict.has_key(key) से अधिक इरादे की स्पष्ट अभिव्यक्ति के रूप में है। ध्यान दें कि गति के वरीयता से कोई लेना देना नहीं है। पठनीयता गति से अधिक महत्वपूर्ण है जबतक कि आप जानते हैं कि आप महत्वपूर्ण पथ में हैं।

+2

.... यह सब, और इसके अलावा, 'has_key()' को बहिष्कृत किया गया है और अब इसका उपयोग नहीं किया जाना चाहिए। :) – jonesy

3

D.has_key समारोह कॉल की वजह से वास्तव में धीमी है:

>>> D = dict((x, y) for x, y in zip(range(1000000), range(1000000))) 
>>> from timeit import Timer 
>>> t = Timer("1700 in D", "from __main__ import D") 
>>> t.timeit() 
0.10631704330444336 
>>> t = Timer("D.has_key(1700)", "from __main__ import D") 
>>> t.timeit() 
0.18113207817077637 
+1

यह "थोड़ा" है? –

+0

अच्छी तरह से उस समय पर कथन को दस लाख बार चलाता है, और संख्या सेकंड में होती है, * पूर्ण * समय अंतर बहुत छोटा – jterrace

+0

80 नैनोसेकंड की तरह कुछ .. – jterrace

3

has_key एक विकल्प नहीं है। यह बहिष्कृत है। इसका इस्तेमाल न करें। (यह किसी भी तरह धीमा है)

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