效率:对于EmptyList中的x vs if length> 0

时间:2014-06-10 21:55:03

标签: python performance list empty-list

对不起,这是一个难题的问题。

如果我想迭代一个可能空的列表,哪个更有效?我希望大多数时候列表都是空的。

for x in list: 
    dostuff()

OR

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

4 个答案:

答案 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周期。