2016-02-24 12 views
18

Lassen Sie uns sagen, ich habe ein einfaches Stück Code wie folgt aus:Schleife, während die Überprüfung, ob Element in einer Liste in Python

for i in range(1000): 
    if i in [150, 300, 500, 750]: 
     print(i) 

Ist die Liste [150, 300, 500, 750] jede Iteration der Schleife erstellt werden? Oder kann ich davon ausgehen, dass der Interpreter (zB CPython 2.7) schlau genug ist, um dies zu optimieren?

+1

Interessante verwandte Frage: [Tupel oder Liste bei Verwendung von 'in' in einer 'if' Klausel?] (Http://stackoverflow.com/q/25368337/953482). Geht näher darauf ein, was CPython unter der Haube macht. – Kevin

+0

Sofern Sie nicht angeben, dass Sie über 1 * spezifischen * Interpreter wissen möchten, ist dies sehr schwer zu beantworten. Können Sie "(sagen wir, CPython 2.7)" umformulieren, um zu spezifizieren, dass Sie genau über diesen Interpreter wissen wollen? –

Antwort

18

Sie können den Bytecode mit dis.dis anzeigen. Hier ist der Ausgang für CPython 2.7.11:

2   0 SETUP_LOOP    40 (to 43) 
       3 LOAD_GLOBAL    0 (range) 
       6 LOAD_CONST    1 (1000) 
       9 CALL_FUNCTION   1 
      12 GET_ITER    
     >> 13 FOR_ITER    26 (to 42) 
      16 STORE_FAST    0 (i) 

    3   19 LOAD_FAST    0 (i) 
      22 LOAD_CONST    6 ((150, 300, 500, 750)) 
      25 COMPARE_OP    6 (in) 
      28 POP_JUMP_IF_FALSE  13 

    4   31 LOAD_FAST    0 (i) 
      34 PRINT_ITEM   
      35 PRINT_NEWLINE  
      36 JUMP_ABSOLUTE   13 
      39 JUMP_ABSOLUTE   13 
     >> 42 POP_BLOCK   
     >> 43 LOAD_CONST    0 (None) 
      46 RETURN_VALUE  

Daher ist die Listenerstellung auf das Laden einer konstanten Tupels optimiert ist (Byte 22). Die Liste (die in diesem Fall in Wirklichkeit ein Tupel ist) wird nicht bei jeder Iteration neu erstellt.