Bu piton uygulanması ve sürümü ve nasıl "sabit listeler" kullanılır bağlıdır. 16 LOAD_CONST 4 ((1, 3, 5))
Python'un gözetleme deliği iyileştirici dönmüş: cevap if
ifadesinin durumda liste sadece bir kez oluşturulduktan olmasıdır sevdiği örnek ile Cpython2.7.10 günü, o
>>> 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
Bildirim ... görünüyor listemize bir tuple (teşekkürler python!) ve bir sabit olarak saklanır. Gözetleme deliği optimize edicisinin, programcıların listeye bir gönderme yapmanın kesinlikle bir yolu olmadığını (eğer listeyi değiştirebilir ve kodun anlamını değiştirebilirseniz) bilirseniz, bu dönüşümleri yalnızca nesneler üzerinde yapabilir. Bildiğim kadarıyla farkındayım, onlar sadece bir in
operatörün ÜSÖ tamamen sabitler oluşan? Elde edilen list
, set
sayılların bu optimizasyon yapmak. Farkında olmadığım başka durumlar da olabilir (dis.dis
, bu optimizasyonları bulmak için arkadaşınızdır).
Yukarıda bahsettim, ancak python'un daha yeni sürümlerinde set-literal'lerle aynı şeyi yapabilirsiniz (python3.2 + 'da set
sabit frozenset
'a dönüştürülür). fayda set
/frozenset
list
/tuple
göre ortalama olarak daha hızlı üyelik test olması vardır.
Bu gibi sorular ne yapılır? –
Cevap "hayır" gibi görünüyor. – Jasper