哪一个更快:迭代一组并迭代列表

时间:2014-08-12 19:22:03

标签: python set

假设我有一个字符串列表和一组相同的字符串:

l = [str1, str2, str3, str4, ...]
s = set([str1, str2, st3, str4, ...])

我需要使用我拥有的短语进行字符串比较:comparephrase

我需要迭代列表或集合中的所有元素,并生成comparephrase和比较字符串之间的比率。我知道当我们进行会员资格测试时,set()会更快。但是,我没有进行成员资格测试,而是比较了我的短语和列表/集合中的字符串。 set()仍然提供更快的速度吗?如果是这样,为什么?在我看来,这个集合实际上是一个内部列表的集合。自从我们在集合中的列表上进行迭代时,这不会花费很长时间吗?

3 个答案:

答案 0 :(得分:2)

Python集优化了相等性测试和重复删除,因此在下面实现了一个哈希表。我相信如果你必须将每个元素都比较为comparephrase,这会使它非常轻微慢于列表。列表非常适合迭代遍历每个元素。不过,几乎在任何情况下,差异可能都是微不足道的。

答案 1 :(得分:2)

我使用timeit进行了一些测试,并且(虽然list的执行速度略快)但没有显着差异:

>>> import timeit
>>> # For the set
>>> timeit.timeit("for i in s: pass", "s = set([1,4,7,10,13])")
0.20565616500061878
>>> # For the list
>>> timeit.timeit("for i in l: pass", "l = [1,4,7,10,13]")
0.19532391999928223

即使尝试多次,这些值仍然保持不变(0.200.19)。

但是,创建集合的开销可以是significant

答案 2 :(得分:1)

遍历 List 比遍历 set 要快得多。

当前接受的答案使用了非常小的设置和列表,因此,那里的区别是微不足道的

以下代码对此进行了解释:

>>> import timeit
>>> l = [ x*x for x in range(1, 400)] 
>>> s = set(l)
>>> timeit.timeit("for i in s: pass", "from __main__ import s")
12.152284085999781
>>> timeit.timeit("for i in l: pass", "from __main__ import l")
5.460189446001095
>>> timeit.timeit("if 567 in l: pass", "from __main__ import l")
6.0497558240003855
>>> timeit.timeit("if 567 in s: pass", "from __main__ import s")
0.04609546199935721

我不知道是什么使集合迭代,但是事实从上面的输出中显而易见。

相关问题