哪个更快:迭代集合和迭代列表

qia*_*aop 7 python set

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

l = [str1, str2, str3, str4, ...]
s = set([str1, str2, st3, str4, ...])
Run Code Online (Sandbox Code Playgroud)

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

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

Adi*_*haw 11

迭代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
Run Code Online (Sandbox Code Playgroud)

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


hlt*_*hlt 1

我已经使用 , 运行了一些测试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
Run Code Online (Sandbox Code Playgroud)

即使尝试多次,这些值也保持非常相同(0.20与)。0.19

然而,创建集合的开销可能很大