Điều này phụ thuộc vào việc triển khai và phiên bản python và cách sử dụng "danh sách liên tục". Trên Cpython2.7.10 với ví dụ của bạn, có vẻ như câu trả lời là các danh sách trong điều kiện báo cáo kết quả if
chỉ được tạo ra một lần ...
>>> 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
Chú ý: 16 LOAD_CONST 4 ((1, 3, 5))
ưu lổ nhìn trộm Python đã quay danh sách của chúng tôi vào một tuple (nhờ python!) và lưu trữ nó như là một hằng số. Lưu ý rằng trình tối ưu hóa lổ nhìn trộm chỉ có thể thực hiện các biến đổi này trên các đối tượng nếu nó biết rằng bạn là lập trình viên hoàn toàn không có cách nào để tham chiếu đến danh sách (nếu không, bạn có thể thay đổi danh sách và thay đổi ý nghĩa của mã). Theo như tôi biết, họ chỉ thực hiện tối ưu hóa này cho list
, set
các chữ cái bao gồm các hằng số hoàn toàn và là RHS của toán tử in
. Có thể có các trường hợp khác mà tôi không biết (dis.dis
là bạn của bạn để tìm các tối ưu hóa này).
Tôi ám chỉ nó ở trên, nhưng bạn có thể làm điều tương tự với set-literals trong các phiên bản mới hơn của python (trong python3.2 +, set
được chuyển đổi thành hằng số frozenset
). Lợi ích ở đây là set
/frozenset
có thử nghiệm thành viên nhanh hơn trung bình hơn list
/tuple
.
câu hỏi như thế này là những gì 'dis' được tạo ra! –
Câu trả lời có vẻ là "không". – Jasper