2012-08-27 11 views
6

मैं दो सरणी वस्तुओं की तरह सामग्री की तुलना करने के लिए है जब - list रों, tuple या collection.deque रों उदाहरण के लिए - वस्तुओं के प्रकार के लिए संबंध के बिना, मैं का उपयोगदो सूची-जैसी वस्तुओं की सामग्री की तुलना करने के सर्वोत्तम तरीके क्या हैं?

list(an_arrayish) == list(another_arrayish) 

वहाँ किसी भी है इसे प्राप्त करने के लिए अधिक मूर्ख/तेज़/बेहतर तरीका?

+1

चा का कोई मौका शीर्षक को "सबसे तेज़ तरीका क्या है ..." पर पहुंचा रहा है? दोनों सूचियों को टुपल्स के रूप में कास्टिंग स्मृति उपयोग को बढ़ाता है, और मैंने कभी इसे एक मूर्खतापूर्ण दृष्टिकोण के रूप में प्रस्तुत नहीं देखा है। –

+0

मैं इसे सबसे अच्छे तरीके से पूछने के लिए बदल दूंगा क्योंकि मैं सबसे ज्यादा पढ़ने योग्य तरीके से सबसे तेज़ में रूचि रखता हूं। – Erik

उत्तर

4

यह elementwise की तुलना करें::

def compare(a,b): 
    if len(a) != len(b): 
     return False 
    return all(i == j for i,j in itertools.izip(a,b)) 

अजगर 3.x के लिए, zip बजाय

का उपयोग

tuple(an_arrayish) == tuple(another_arrayish) 

यहां एक त्वरित बेंचमार्क है

+2

को परिभाषित करके इसे परिभाषित करने के लिए व्यक्तिगत वर्ग पर निर्भर है, ऊपर दिए गए बेंचमार्क का उपयोग करके, यह लगभग 9-10 सेकंड के समय देता है। – Ryan

+2

@minitech यह अपेक्षा की जाती है क्योंकि पाइथन लूप स्पष्ट रूप से सी लूप से धीमे होते हैं। लेकिन यह आपकी याददाश्त को कभी भी उड़ाएगा क्योंकि इसे स्टोरेज को दोगुना करने की आवश्यकता नहीं है क्योंकि टुपल/सूची दृष्टिकोण करता है। साथ ही, यह विभिन्न आकारों (या पहले आइटमों में भिन्न होने वाले) की सूचियों के लिए बेहतर होगा – JBernardo

+0

मिनीटेक: दो मिलियन आइटम सूचियों की तुलना मेरी मशीन पर 200ms लेती है। मुझे यकीन नहीं है कि आप क्या कर रहे हैं जो इतना समय ले रहा है। –

0

ट्यूपल्स और सूचियों की तुलना संबंधित तत्वों की तुलना में लेक्सिकोोग्राफ़िक रूप से की जाती है। इसका मतलब है कि बराबर की तुलना करने के लिए, प्रत्येक तत्व बराबर तुलना करना चाहिए और दो अनुक्रमों को एक ही प्रकार का होना चाहिए और समान लंबाई होनी चाहिए।

देखकर कि हम सम्मेलन कुछ अन्य भाषाओं के उपयोग करने में नहीं चल रहे "समानता यहाँ अगर इन संदर्भों को स्मृति में एक ही वस्तु का उल्लेख हम परीक्षण कर रहे हैं इसका मतलब है" मैं == समानता परीक्षण के साथ चिपके हुए कहेंगे इसे पूरा करने का सबसे आसान तरीका और इसलिए सबसे अच्छा तरीका है।

+1

अन्य भाषा का '==' पायथन में मौजूद है, 'is' के रूप में। – Erik

+1

@erik यह सच है। मैं बहस नहीं कर रहा था कि यह नहीं था, बस पाइथन का '==' व्यवहार संदर्भ चर के लिए 'my_java_string.equals (your_java_string) जैसे कोड लिखने से बहुत कम भाषाओं में नहीं था। चूंकि हमारे पास यह (आईएमओ) nicer '==' व्यवहार है, इसलिए मेरा वोट आपके द्वारा उल्लिखित मामले के लिए उपयोग जारी रखने के लिए जारी है। – chucksmash

+0

@Eric:> अन्य भाषा का == पाइथन में मौजूद है, जैसा कि <यह सच नहीं है। दो सूचियों, एल 1 और एल 2 को देखते हुए, पायथन का 'केवल' परीक्षण केवल तभी परीक्षण करता है जब एल 1 और एल 2 उनके स्मृति पते का परीक्षण करके एक ही वस्तु हो। तो 'l1 l2' रिटर्न सही है अगर l1 और l2 एक ही पते पर कब्जा करते हैं। 'l1 == l2' पायथन में मौजूद है, लेकिन एक अलग कार्य करता है। '__eq__' विधि –

3

tuples तेजी से प्रतीत होते हैं:

>>> timeit.Timer('list(a) == list(b)', 'a, b = (1, 2, 3, 4, 5), (1, 2, 3, 4, 6)').timeit() 
2.563981056213379 
>>> timeit.Timer('list(a) == list(b)', 'a, b = [1, 2, 3, 4, 5], [1, 2, 3, 4, 6]').timeit() 
2.4739551544189453 
>>> timeit.Timer('tuple(a) == tuple(b)', 'a, b = (1, 2, 3, 4, 5), (1, 2, 3, 4, 6)').timeit() 
1.3630101680755615 
>>> timeit.Timer('tuple(a) == tuple(b)', 'a, b = [1, 2, 3, 4, 5], [1, 2, 3, 4, 6]').timeit() 
1.475499153137207 
संबंधित मुद्दे