循环检查 Python 中的列表中是否有元素
Loop while checking if element in a list in Python
假设我有这样一段简单的代码:
for i in range(1000):
if i in [150, 300, 500, 750]:
print(i)
列表 [150, 300, 500, 750]
是否在循环的每次迭代中创建?或者我可以假设解释器(比如 CPython 2.7)足够聪明来优化它吗?
您可以使用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)的加载进行了优化。列表(在这种情况下实际上是一个元组)不会在每次迭代时重新创建。
假设我有这样一段简单的代码:
for i in range(1000):
if i in [150, 300, 500, 750]:
print(i)
列表 [150, 300, 500, 750]
是否在循环的每次迭代中创建?或者我可以假设解释器(比如 CPython 2.7)足够聪明来优化它吗?
您可以使用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)的加载进行了优化。列表(在这种情况下实际上是一个元组)不会在每次迭代时重新创建。