To zależy od implementacji i wersji Pythona oraz od sposobu użycia "stałych list". Na Cpython2.7.10 ze swoim przykładzie, wygląda na to, że odpowiedź jest, że lista w stan rachunku if
jest tworzony tylko raz ...
>>> def foo():
... for i in iterable:
... if i in [1, 3, 5]:
... print(i)
...
>>> import dis
>>> dis.dis(foo)
2 0 SETUP_LOOP 34 (to 37)
3 LOAD_GLOBAL 0 (iterable)
6 GET_ITER
>> 7 FOR_ITER 26 (to 36)
10 STORE_FAST 0 (i)
3 13 LOAD_FAST 0 (i)
16 LOAD_CONST 4 ((1, 3, 5))
19 COMPARE_OP 6 (in)
22 POP_JUMP_IF_FALSE 7
4 25 LOAD_FAST 0 (i)
28 PRINT_ITEM
29 PRINT_NEWLINE
30 JUMP_ABSOLUTE 7
33 JUMP_ABSOLUTE 7
>> 36 POP_BLOCK
>> 37 LOAD_CONST 0 (None)
40 RETURN_VALUE
Wskazówka: 16 LOAD_CONST 4 ((1, 3, 5))
Pythona wizjer optymalizator okazało nasza lista do krotki (dzięki python!) i zapisana jako stała. Zauważ, że optymalizator peephole może wykonać te transformacje tylko na obiektach, jeśli wie, że ty jako programista absolutnie nie masz możliwości uzyskania odnośnika do listy (w przeciwnym razie możesz zmutować listę i zmienić znaczenie kodu). O ile mi wiadomo, wykonują tę optymalizację tylko dla literałów, które składają się ze stałych i są RHS operatora in
. Mogą istnieć inne przypadki, o których nie wiem (dis.dis
jest Twoim przyjacielem w znajdowaniu tych optymalizacji).
Dowiedziałem się o tym wyżej, ale możesz zrobić to samo z set-literals w nowszych wersjach pythona (w python3.2 +, set
jest konwertowany na stałą frozenset
). Korzyścią jest to, że set
/frozenset
mają szybsze testy członkostwa średnio niż list
/tuple
.
pytania takie są właśnie z tego powodu "dis"! –
Odpowiedź wydaje się być "nie". – Jasper