在空列表上的for循环实际上会花费时间/资源吗?

时间:2015-11-03 23:08:32

标签: python for-loop resources

这不是一个特定于任何代码的问题,也不是我遇到的问题,但为了知识,我想知道。

说,我有以下代码:

# 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,我只是很好奇。

2 个答案:

答案 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