2012-12-21 24 views
1

在我的代码中,列表最终会以所有元素为空来结束。这就是我测试的所有元素==''。在Python中这将是与列表进行比较/测试的最快方法

列表的大小可能因输入而异。

我正在考虑的两个测试是一个相等测试,并使用list.count()函数。运行时速度会更快。

我是python的新手,所以如何在后台完成事情并不是我所熟悉的。我的假设是,测试2将更快,如果它不迭代检查每个元素进行比较。由于列表中的数据可能会从空字符串变为超过100个字符的字符串,因此测试1 count('')的简单检查也可能非常快。

示例代码设置我的变量进行测试。

mylist = [''] * 33 
testlist = [] 
testlist.extend('' * mylist.__len__()) 
testlist.count('') 
33 
mylist.count('') 
33 

以下哪项测试会更快。

测试1

if mylist.count('') == 33: 
    do some thing 

while mylist.count('') !=33: 
    do some thing 

测试2

if mylist == testlist: 
    do some thing 

while mylist != testlist: 
    do some thing 

回答

1

你不介绍​​您实际上是试图解决问题,但您在设置列表条目为空字符串为了标记它们已完成,以便您不再处理它们?

如果是这样的话,那么你可以通过使用不同的数据结构来获得更好的结果。例如,也许你可以在完成它们后使用setremove项目。然后你可以测试一下,看看你的设备是否是空的,这是一个恒定时间的操作。

但是,为了能够帮助您,我们需要更多地了解您要做的事情。

如果你只是想弄清楚哪两个实现更快,Python的timeit module包含代码定时执行功能。例如:

>>> from timeit import timeit 
>>> l1 = [''] * 1000 
>>> l2 = [''] * 1000 
>>> timeit(lambda:l1 == l2) 
4.670141935348511 
>>> timeit(lambda:l1.count('') == len(l1)) 
4.50224494934082 

所以看起来这两种方法需要在这种情况下几乎完全一样的时间(因为你可能已经猜到了)。但在列表不是完全空字符串的情况下,==更快(因为当它找到一个匹配就可以立即返回False无需检查更多的列表元素):

>>> l3 = ['a'] + [''] * 999 
>>> timeit(lambda:l3.count('') == len(l3)) 
4.379799842834473 
>>> timeit(lambda:l3 == l2) 
0.19073486328125 
+0

timeit看起来非常有用。我会去试验我的一些代码,看看它是如何运行的。 – nelaaro

相关问题