1

在我的代码中,列表最终将所有元素都为空。这是我正在测试的,所有元素==''。

列表的大小可以随输入而变化。

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

我是 python 新手,所以我对后台的操作方式并不熟悉。我的假设是,如果不迭代检查每个元素进行比较,测试 2会更快。由于列表中的数据可以从空字符串到超过 100 个字符的字符串不等,因此由Test 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
4

1 回答 1

1

您没有描述您实际尝试解决的问题,但是您是否将列表条目设置为空字符串以将它们标记为已完成,以便您不再处理它们?

如果是这种情况,那么您可以通过使用不同的数据结构获得更好的结果。例如,也许您可​​以在使用set, 和remove项目后使用它们。然后你可以测试一下你的集合是否为空,这是一个常数时间的操作。

但我们需要更多地了解您正在尝试做的事情,以便能够为您提供帮助。

如果您只是想弄清楚两种实现中的哪一种更快,Python 的timeit模块包含用于定时执行代码的函数。例如:

>>> 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
于 2012-12-21T13:55:29.173 回答