2016-02-24 29 views
18

Diciamo che ho un semplice pezzo di codice come questo:Loop mentre si controlla se elemento in una lista in Python

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

Condivide la lista [150, 300, 500, 750] vengono creati ogni iterazione del ciclo? O posso supporre che l'interprete (ad esempio, CPython 2.7) sia abbastanza intelligente da ottimizzarlo?

+1

Interessante domanda correlata: [Tupla o elenco quando si utilizza 'in' in una clausola 'if'?] (Http://stackoverflow.com/q/25368337/953482). Passa in qualche dettaglio su ciò che CPython fa sotto il cofano. – Kevin

+0

Se non si specifica che si desidera conoscere l'interprete 1 * specifico *, è molto difficile rispondere. Puoi riformulare "(per esempio, CPython 2.7)" per specificare esattamente cosa vuoi sapere su quell'interprete? –

risposta

18

È possibile visualizzare il codice byte utilizzando dis.dis. Ecco l'output per 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  

Quindi, la creazione della lista è ottimizzato per il caricamento di una tupla costante (byte 22). L'elenco (che in realtà è una tupla in questo caso) non viene creato di nuovo su ogni iterazione.