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

2024-09-30 12:15:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有以下代码:

# 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子句中,我只是好奇。在


Tags: andthe代码idforlenifscreen
2条回答

不是我的代码,但是如果我们看看这里,我们会发现时间被用来创建这个“空列表”。在

% 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

至于实际迭代列表,是的,这也会消耗资源。解释程序至少必须知道列表是空的,所以它必须进入内存位置以查看它是空的。在

如果你问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

相关问题 更多 >

    热门问题