这不是一个特定于任何代码的问题,也不是我遇到的问题,但为了知识,我想知道。
说,我有以下代码:
# list1 and list2 are determinied off the screen
if len(list1) > 0:
cycler = list1
elif len(list2) > 1:
cycler = list2
else:
cycler = []
for id in cycler:
t = Thing._by_id(id)
# a lot of stuff done with t
在第三种情况下,cycler = []
,是否有任何资源/时间用于for循环,或者for循环是否立即中断?我根本不担心这个,事实上,我在函数中有这个,而在else子句中它是return
,我只是很好奇。
答案 0 :(得分:1)
不是我的代码,但是如果我们看一下这里,我们会看到时间被用来创建这个“空列表”。
% python -mtimeit "l=[]"
10000000 loops, best of 3: 0.0711 usec per loop
% python -mtimeit "l=list()"
1000000 loops, best of 3: 0.297 usec per loop
就实际迭代列表而言,是的,这也会花费资源。解释器必须至少知道列表是空的,所以它必须进入内存位置才能看到它是空的。
答案 1 :(得分:0)
如果您通过完全跳过循环来询问Python解释器是否能够进行优化,我认为答案是否定的。如果你在空列表中查看迭代的字节码,所有的循环设置步骤仍然完成,并为循环内的代码生成字节码(虽然它实际上没有被执行):
import dis
def run_empty_loop():
a = []
for item in a:
x = 1 + 1
dis.dis(run_empty_loop)
2 0 BUILD_LIST 0
3 STORE_FAST 0 (a)
3 6 SETUP_LOOP 20 (to 29)
9 LOAD_FAST 0 (a)
12 GET_ITER
>> 13 FOR_ITER 12 (to 28)
16 STORE_FAST 1 (item)
4 19 LOAD_CONST 2 (2)
22 STORE_FAST 2 (x)
25 JUMP_ABSOLUTE 13
>> 28 POP_BLOCK
>> 29 LOAD_CONST 0 (None)
32 RETURN_VALUE