@ EriF89 दिखाने के लिए परीक्षणों के एक नए सेट के रूप में इन सभी वर्षों के बाद भी सही है:
$ python -m timeit -s "l={k:k for k in xrange(5000)}" "[i for i in xrange(10000) if i in l]"
1000 loops, best of 3: 1.84 msec per loop
$ python -m timeit -s "l=[k for k in xrange(5000)]" "[i for i in xrange(10000) if i in l]"
10 loops, best of 3: 573 msec per loop
$ python -m timeit -s "l=tuple([k for k in xrange(5000)])" "[i for i in xrange(10000) if i in l]"
10 loops, best of 3: 587 msec per loop
$ python -m timeit -s "l=set([k for k in xrange(5000)])" "[i for i in xrange(10000) if i in l]"
1000 loops, best of 3: 1.88 msec per loop
यहां हम कुछ उपयोग मामलों में tuple
तुलना करने वाले lists
(और कम मेमोरी का उपयोग करने वाले) तेजी से ज्ञात होते हैं । लुकअप टेबल के मामले में, tuple
मेला बेहतर नहीं रहा।
दोनों dict
औरset
बहुत अच्छा प्रदर्शन किया। यह विशिष्टता के बारे में @SententGhost उत्तर में बांधने के लिए एक दिलचस्प बिंदु लाता है: यदि ओपी के पास डेटा सेट में 10M मान हैं, और यह अज्ञात है अगर उनमें डुप्लिकेट हैं, तो यह समानांतर में अपने तत्वों का एक सेट / तानाशाही रखने लायक होगा। वास्तविक डेटा सेट के साथ, और उस सेट / अस्तित्व में अस्तित्व के लिए परीक्षण। यह संभव है कि 10M डेटा बिंदुओं में केवल 10 अद्वितीय मूल्य हों, जो कि खोज करने के लिए बहुत छोटा स्थान है!
Dicts के बारे में साइलेंटगॉस्ट की गलती वास्तव में रोशन है क्योंकि एक डुप्लिकेट डेटा (मानों में) को एक nonduplicated सेट (कुंजियों) में सहसंबंधित करने के लिए एक तानाशाह का उपयोग कर सकता है, और इस प्रकार सभी डेटा रखने के लिए एक डेटा ऑब्जेक्ट रखता है, फिर भी एक लुकअप तालिका के रूप में तेज़ है। उदाहरण के लिए, एक प्रमुख कुंजी मूल्य को देखा जा सकता है, और मूल्य एक काल्पनिक सूची में सूचकांकों की एक सूची हो सकती है जहां यह मूल्य हुआ था।
उदाहरण के लिए, यदि स्रोत डेटा सूची को खोजा जाना था l=[1,2,3,1,2,1,4]
, तो इसे इस श्रुत के साथ प्रतिस्थापित करके खोज और मेमोरी दोनों के लिए अनुकूलित किया जा सकता है:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> l=[1,2,3,1,2,1,4]
>>> for i, e in enumerate(l):
... d[e].append(i)
>>> d
defaultdict(<class 'list'>, {1: [0, 3, 5], 2: [1, 4], 3: [2], 4: [6]})
इस आदेश के साथ, कोई भी जान सकता है:
- यदि मान मूल डेटासेट में था (यानी
2 in d
रिटर्न True
)
- कहाँ मूल्य मूल डाटासेट में था (यानी
d[2]
सूचकांकों की सूची जहां डाटा मूल डेटा सूची में पाया गया था रिटर्न: [1, 4]
)