假设我有一个图,并想要查看b是否在N[a]中。哪种实现方式更快,为什么?
a, b = range(2)
N = [set([b]), set([a,b])]
或者
N= [[b],[a,b]]
这显然是过于简化了,但想象一下图表变得非常密集。
这完全取决于你想要实现什么。以你的示例为例,使用列表更快,因为你不需要创建集合所需的额外开销:
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
然而,正如此前提到的那样,当你在搜索大数据集时,使用集合会带来好处。根据你的示例无法确定你的转折点在哪里以及你是否会获益。
我建议你两种方式都测试并选择对于你特定用例更快的方法。
集合(指使用哈希实现的集合,例如HashSet)比列表更快地查找值。列表必须按顺序查找以确定值是否存在。HashSet可以直接跳转并定位桶,在几乎恒定的时间内查找值。
N
中单个项目b
的成员资格测试(b in N[a]
),因此无论如何都不是O(n)。 - user395760O(1)
(+注释)比O(log n)
(-注释)更好的描述。 - phihag