Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 效率:对于空列表中的x与if长度>;0_Python_Performance_List_Empty List - Fatal编程技术网

Python 效率:对于空列表中的x与if长度>;0

Python 效率:对于空列表中的x与if长度>;0,python,performance,list,empty-list,Python,Performance,List,Empty List,对不起,这是一个很难回答的问题 如果我想迭代一个可能为空的列表,哪一个更有效?我希望列表大部分时间都是空的 for x in list: dostuff() 或 第一个变体效率更高,因为Python的for循环无论如何都会检查列表的长度,使得额外的显式检查只是浪费CPU周期。如果列表: In [15]: if l: ....: print "hello" ....: In [16]: l1= [1] In [17]: if l1: ....:

对不起,这是一个很难回答的问题

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

for x in list: 
    dostuff()


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

如果列表:

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
,因此无需根据
timeit
模块的计时检查
len(list)

>>> 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 len(list)>0:
应该是
if list:
,以提高可读性。我个人认为如果语句是多余的,那么使用
,但是
timeit
似乎证明我错了。似乎(除非我犯了一个愚蠢的错误)检查空列表会使代码更快(对于空列表):


废话少说。基准就是它的所在!(而且,您忽略了设置循环和进入列表方法所需时间比Python级别的长度检查要长的可能性。)根据timeit,没有任何区别,即有时更快,有时更慢。第一个显示的是0.003286123275756836,第二个显示的是0.0032868385314941406,超过10000个循环question@TimCastelijns如果列表通常是空的,那么使用
If list
将不会有任何冒犯,但这类问题是人们可能提出的最没有效率的问题之一。不仅令人惊讶的是,任何性能差异实际上都不太可能有丝毫影响,如果有,您应该通过基准测试来解决这一问题,而不是询问或猜测。当查看C代码并了解所涉及的整个硬件和软件堆栈时,关于性能的推理甚至不能很好地工作。当查看Python代码而对硬件和Python实现不太了解时,情况会更糟。
>>> timeit('if lst:\n  for x in lst:\n    pass', 'lst=[]')
0.03235578536987305
$ 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