对不起,这是一个难题的问题。
如果我想迭代一个可能空的列表,哪个更有效?我希望大多数时候列表都是空的。
for x in list:
dostuff()
OR
if len(list)>0:
for x in list:
dostuff()
答案 0 :(得分:2)
基于timeit
模块的时间安排:
>>> from timeit import timeit
>>> timeit('for x in lst:pass', 'lst=[]')
0.08301091194152832
>>> timeit('if len(lst)>0:\n for x in lst:\n pass', 'lst=[]')
0.09223318099975586
当列表为空时,看起来只是执行for
循环会更快,无论列表的状态如何,它都会更快。
但是,有一个明显更快的选择:
>>> timeit('if lst:\n for x in lst:\n pass', 'lst=[]')
0.03235578536987305
使用if lst
比检查列表长度或始终执行for
循环要快得多。但是,这三种方法都非常快,因此如果您尝试优化代码,我建议您尝试找出真正的瓶颈 - 看看When is optimisation premature?。
答案 1 :(得分:1)
您可以使用if list:
In [15]: if l:
....: print "hello"
....:
In [16]: l1= [1]
In [17]: if l1:
....: print "hello from l1"
....:
hello from l1
In [21]: %timeit for x in l:pass
10000000 loops, best of 3: 54.4 ns per loop
In [22]: %timeit if l:pass
10000000 loops, best of 3: 22.4 ns per loop
如果列表为空if list
将评估为False
,因此无需检查len(list)
。
答案 2 :(得分:1)
首先if len(list) > 0:
应为if list:
以提高可读性。我个人原本认为if
语句是多余的,但timeit
似乎证明我错了。看起来(除非我犯了一个愚蠢的错误),检查一个空列表会使代码更快(对于一个空列表):
$ python -m timeit 'list = []' 'for x in list:' ' print x'
10000000 loops, best of 3: 0.157 usec per loop
$ python -m timeit 'list = []' 'if list:' ' for x in list:' ' print x'
10000000 loops, best of 3: 0.0766 usec per loop
答案 3 :(得分:0)
第一种变体更有效,因为Python的循环检查列表的长度无论如何,进行额外的显式检查只是浪费CPU周期。