假设我有一个字符串列表和一组相同的字符串:
l = [str1, str2, str3, str4, ...]
s = set([str1, str2, st3, str4, ...])
我需要使用我拥有的短语进行字符串比较:comparephrase
我需要迭代列表或集合中的所有元素,并生成comparephrase
和比较字符串之间的比率。我知道当我们进行会员资格测试时,set()
会更快。但是,我没有进行成员资格测试,而是比较了我的短语和列表/集合中的字符串。 set()
仍然提供更快的速度吗?如果是这样,为什么?在我看来,这个集合实际上是一个内部列表的集合。自从我们在集合中的列表上进行迭代时,这不会花费很长时间吗?
答案 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.20
与0.19
)。
但是,创建集合的开销可以是significant。
答案 2 :(得分:1)
当前接受的答案使用了非常小的小设置和列表,因此,那里的区别是微不足道的。
以下代码对此进行了解释:
>>> 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
我不知道是什么使集合迭代慢,但是事实从上面的输出中显而易见。