2013-12-10 6 views
12

Q1 - है निम्नलिखित एक generator expression या एक set comprehension के set()? (या वे ही कर रहे हैं यदि हां, तो कर रहे हैं list & dict comprehensions भी इसी प्रकार के कलाकारों जनरेटर पर?)पाइथन सेट समझें कैसे काम करती हैं?

my_set = {x for x in range(10)} 

Q2 - मूल्यांकन पर विचार डुप्लिकेट मानों & फिर उन्हें set() लगाने से हटाने करता है?

dup_set = {x for x in [0, 1, 2, 0, 1, 2]} 

समझ प्रदर्शन करता है (गति वार) नियमित for छोरों की तुलना में बेहतर?

अद्यतन - मैं गति तुलना के लिए timeit उपयोग करने की कोशिश। मुझे यकीन नहीं है कि अगर मैं हूं तो इसके बारे में (मेला)।

C:\>python -m timeit "s = set()" "for x in range(10):" " 
    s.add(x)" 
100000 loops, best of 3: 2.3 usec per loop 

C:\>python -m timeit "s = {x for x in range(10)}" 
1000000 loops, best of 3: 1.68 usec per loop 

अब, कुछ सशर्त,

का उपयोग कर
C:\>python -m timeit "s = set()" "for x in range(10):" " 
    if x%2: s.add(x)" 
100000 loops, best of 3: 2.27 usec per loop 

C:\>python -m timeit "s = {x for x in range(10) if x%2}" 
1000000 loops, best of 3: 1.83 usec per loop 

तो, वहाँ काफी कुछ अंतर है, है यह कार्यक्षमता c में hardcoded किया जा रहा की वजह से है?

+1

शायद आप टाइमिट (http://docs.python.org/2/library/timeit.html) का उपयोग कर सकते हैं या समय/गति अंतर – Totem

उत्तर

7

Q1: हाँ, हाँ, हाँ और हाँ। या कम से कम वे इस तरह व्यवहार करते हैं। यदि आप बाइटकोड को देख रहे हैं तो यह थोड़ा अलग है। चलो इस कोड (अजगर 2.7) disassembly करते हैं:

def list_comp(l): 
    return [x+1 for x in l] 

def dict_comp(l): 
    return {x+1:0 for x in l} 

def set_comp(l): 
    return {x+1 for x in l} 

def generator(l): 
    return (x+1 for x in l) 

यह आपको क्या मिलता है:

Disassembly of list_comp: 
    2   0 BUILD_LIST    0 
       3 LOAD_FAST    0 (l) 
       6 GET_ITER    
     >> 7 FOR_ITER    16 (to 26) 
      10 STORE_FAST    1 (x) 
      13 LOAD_FAST    1 (x) 
      16 LOAD_CONST    1 (1) 
      19 BINARY_ADD   
      20 LIST_APPEND    2 
      23 JUMP_ABSOLUTE   7 
     >> 26 RETURN_VALUE 
Disassembly of dict_comp: 
    5   0 LOAD_CONST    1 (<code object <dictcomp> at 029DEE30) 
       3 MAKE_FUNCTION   0 
       6 LOAD_FAST    0 (l) 
       9 GET_ITER    
      10 CALL_FUNCTION   1 
      13 RETURN_VALUE 
Disassembly of set_comp: 
    8   0 LOAD_CONST    1 (<code object <setcomp> at 029DECC8) 
       3 MAKE_FUNCTION   0 
       6 LOAD_FAST    0 (l) 
       9 GET_ITER    
      10 CALL_FUNCTION   1 
      13 RETURN_VALUE 
Disassembly of generator: 
11   0 LOAD_CONST    1 (<code object <genexpr> at 02A8FD58) 
       3 MAKE_FUNCTION   0 
       6 LOAD_FAST    0 (l) 
       9 GET_ITER    
      10 CALL_FUNCTION   1 
      13 RETURN_VALUE      

बाईटकोड मुश्किल से dict comprenhension, सेट समझ और जनरेटर के लिए ही है। वे सभी एक कोड ऑब्जेक्ट लोड करते हैं (<dictcomp>, <setcomp> या <genexpr>) और उसके बाद एक कॉल करने योग्य कार्य करें। सूची समझ अलग है क्योंकि यह आपकी सूची समझ से संबंधित बाइटकोड उत्पन्न करती है। इस बार इसका अर्थ है और इस प्रकार मूल नहीं है।

Q2: यह वास्तव में डुप्लिकेट मानों को नहीं मानता क्योंकि यह सूची आपके द्वारा दिया गया के साथ एक समझ पैदा करता है। और फिर यह समझ के साथ सेट बनाता है।

समय के बारे में: सूची/डिक्ट/सेट समझ किसी और चीज़ से तेज़ी से होती है। यहां तक ​​कि यदि उनका व्याख्या किया गया है, तो बाइटकोड जेनरेट किए गए अधिकांश मामलों के लिए SET_ADD, LIST_APPEND या MAP_ADD जैसे विशेष बाइटकोड निर्देशों के साथ अनुकूलित किया गया है।

+0

को सी में लिखे गए समय मॉड्यूल के साथ कोड टाइमिंग फ़ंक्शन का निर्माण कर सकते हैं '?? –

+0

मुझे यकीन नहीं है, मैं इसे देख लूंगा। – Vincent

+3

स्पष्ट रूप से यह जो लिखा गया है उस पर निर्भर करता है कि आप किस पायथन का उपयोग कर रहे हैं (सीपीथन, आयरनपीथन, ज्योथन, पायपी, आदि)। हालांकि, महत्वपूर्ण बात यह है कि यह _native_ है अर्थात intepreted नहीं है। –

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