哪个更快,为什么?集合还是列表?
假设我有一个图(可以理解为一个由点和线组成的结构),我想检查一下某个点b是否在点的邻居中,也就是看b是否和直接相连。那下面这两种方法,哪种更快呢?为什么呢?
a, b = range(2)
N = [set([b]), set([a,b])]
或者
N= [[b],[a,b]]
这显然是个简单化的例子,但想象一下,如果这个图变得非常复杂,连接的点很多,那情况就会不一样了。
3 个回答
3
集合(我指的是像 HashSet 这样的基于哈希的集合)在查找一个值时比列表要快得多。列表需要一个一个地顺序查找,才能确定这个值是否存在。而 HashSet 可以直接跳到特定的位置,几乎可以在固定的时间内找到这个值。
5
这完全取决于你想要实现什么。用你给的例子来说,使用列表会更快,因为你不需要花时间去创建集合:
import timeit
def use_sets(a, b):
return [set([b]), set([a, b])]
def use_lists(a, b):
return [[b], [a, b]]
t=timeit.Timer("use_sets(a, b)", """from __main__ import use_sets
a, b = range(2)""")
print "use_sets()", t.timeit(number=1000000)
t=timeit.Timer("use_lists(a, b)", """from __main__ import use_lists
a, b = range(2)""")
print "use_lists()", t.timeit(number=1000000)
输出结果是:
use_sets() 1.57522511482
use_lists() 0.783344984055
不过,正如之前提到的,当你在处理大数据集时,使用集合会有好处,特别是在进行搜索的时候。根据你的例子,很难判断你在哪个点上会发现这种好处。
我建议你两种方法都试一下,看看哪种在你的具体情况下更快。