对不起,标题有点难。
如果我想遍历一个可能为空的列表,哪个更有效?我希望列表大部分时间都是空的。
for x in list:
dostuff()
或者
if len(list)>0:
for x in list:
dostuff()
对不起,标题有点难。
如果我想遍历一个可能为空的列表,哪个更有效?我希望列表大部分时间都是空的。
for x in list:
dostuff()
或者
if len(list)>0:
for x in list:
dostuff()
根据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
但是,这三种方法都非常快,因此如果您尝试优化代码,我建议您尝试找出真正的瓶颈 - 看看何时优化还为时过早?.
你可以使用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)
.
首先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
第一个变体更有效,因为 Python 的 for 循环无论如何都会检查列表的长度,使额外的显式检查只是浪费 CPU 周期。