哪个更快,为什么?设置还是列出?

时间:2011-10-10 18:25:58

标签: python list graph set

让我们说我有一个图表,想看看b in N[a]。哪个更快实现?为什么?

a, b = range(2)
N = [set([b]), set([a,b])]

OR

N= [[b],[a,b]]

这显然过于简单,但想象一下图形变得非常密集。

3 个答案:

答案 0 :(得分:36)

集合中的成员资格测试速度要快得多,特别是对于大型集合。这是因为该集使用hash function映射到存储桶。由于Python实现自动调整该哈希表的大小,因此无论集合的大小如何(假设哈希函数足够好),速度都可以是常量(O(1))。

相反,为了评估对象是否是列表的成员,Python必须比较每个成员的相等性,即测试是O(n)

答案 1 :(得分: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

但是,由于此处已经提到的原因,当您搜索大集时,您将从使用集中受益。你的例子不可能告诉你哪个拐点适合你,以及你是否会看到这个好处。

我建议你两种方式进行测试,并根据具体用例采用更快的方式。

答案 2 :(得分:3)

Set(我的意思是基于散列的集合,如HashSet)比List更快地查找值。列表必须按顺序查找值是否存在。 HashSet可以直接跳转并定位存储桶,并在几乎恒定的时间内查找值。