2013-01-23 68 views
1

我不知道这下面是一个元组(也可用于列表或一个int)做得更快:“不等于”或“大于”更快?

a_tuple = ('a', 'b',) 
  1. if (len(a_tuple) != 0): pass

  2. if (len(a_tuple) > 0): pass

我做一些timeit实验,结果非常相似(每次运行timeit进行100000次迭代时都会有所不同)。我只是想知道是否有时间利益。

+6

这样的微观优化很少有益。如果你需要速度,把它外包给C. – Xophmeister

回答

7

的长度使用not a_tupleTrue如果为空)或tupleTrue如果不为空),而不是测试:

if a_tuple: 
    pass 

或者,作为示范事实胜于雄辩:

>>> if not(): 
...  print('empty!') 
... 
empty! 
>>> if (1, 0): 
...  print('not empty!') 
... 
not empty! 

除了这是一个微观优化的事实之外,测试空元组的虚假性也更快。如果对速度有疑问,请使用timeit模块:

>>> import timeit 
>>> a_tuple = (1,0) 
>>> def ft_bool(): 
...  if a_tuple: 
...   pass 
... 
>>> def ft_len_gt(): 
...  if len(a_tuple) > 0: 
...   pass 
... 
>>> def ft_len_ne(): 
...  if len(a_tuple) != 0: 
...   pass 
... 
>>> timeit.timeit('ft()', 'from __main__ import ft_bool as ft') 
0.17232918739318848 
>>> timeit.timeit('ft()', 'from __main__ import ft_len_gt as ft') 
0.2506139278411865 
>>> timeit.timeit('ft()', 'from __main__ import ft_len_ne as ft') 
0.23904109001159668 
+0

此外,它快两倍。 – bereal

+0

等待,如果你有一个空元组的实例,它如何“如果a_tuple”为假? – Ivaylo

+0

@Ivaylo:因为空元组是'虚假'的。在布尔上下文中,它测试为False,就像空字符串或0(任何数字类型)。见http://docs.python.org/2/reference/expressions.html#boolean-operations –