Подтвердить что ты не робот

Loop при проверке, если элемент в списке в Python

Скажем, у меня есть простой фрагмент кода:

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

Создается ли список [150, 300, 500, 750] для каждой итерации цикла? Или я могу предположить, что интерпретатор (скажем, CPython 2.7) достаточно умен, чтобы оптимизировать это?

4b9b3361

Ответ 1

Вы можете просмотреть байт-код, используя dis.dis. Здесь вывод для 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      

Следовательно, создание списка оптимизировано для загрузки постоянного кортежа (байт 22). Список (который на самом деле является кортежем в этом случае) не создается заново на каждой итерации.