效率:对于EmptyList中的x与如果长度>0

2024-04-25 11:37:58 发布

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

抱歉,这是个很难回答的问题。你知道吗

如果我想迭代一个可能为空的列表,哪个更有效?我希望清单大部分时间都是空的。你知道吗

for x in list: 
    dostuff()

或者

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

Tags: in列表forlenif时间listdostuff
3条回答

基于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?。你知道吗

你可以用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

相关问题 更多 >