-2

对不起,标题有点难。

如果我想遍历一个可能为空的列表,哪个更有效?我希望列表大部分时间都是空的。

for x in list: 
    dostuff()

或者

if len(list)>0:
     for x in list:
        dostuff()
4

4 回答 4

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但是,这三种方法都非常快,因此如果您尝试优化代码,我建议您尝试找出真正的瓶颈 - 看看何时优化还为时过早?.

于 2014-06-10T22:01:25.783 回答
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).

于 2014-06-10T22:00:06.647 回答
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
于 2014-06-10T22:07:42.943 回答
0

第一个变体更有效,因为 Python 的 for 循环无论如何都会检查列表的长度,使额外的显式检查只是浪费 CPU 周期。

于 2014-06-10T21:59:10.790 回答