Python集合与列表

262 投票
11 回答
250838 浏览
提问于 2025-04-15 22:41

在Python中,哪种数据结构更高效、更快呢?假设我不太在乎顺序,而且我会检查重复项,那么Python的集合(set)会比Python的列表(list)慢吗?

11 个回答

25

集合(Set)的优势在于几乎可以瞬间检查某个元素是否存在:https://en.wikipedia.org/wiki/Hash_table

列表(List)的实现:通常是一个数组,底层操作比较接近硬件,适合遍历和通过元素索引随机访问

集合(Set)的实现:https://en.wikipedia.org/wiki/Hash_table,它不是通过遍历列表来查找元素,而是通过计算一个哈希值来找到元素,这个过程依赖于键的特性和哈希函数。这个方法和字典(dict)使用的类似。我猜如果元素很少(少于5个),列表(list)可能会更快,但当元素数量增多时,集合(set)在检查元素是否存在时会表现得更好。它在添加和删除元素时也很快。不过,记住构建一个集合是有成本的!

注意:如果列表(list)已经排好序,那么在小型列表中查找可能会很快,但随着数据量增大,集合(set)在检查元素是否存在时会更快。

233

列表在你只是想遍历值的时候,速度稍微快一点。

但是,如果你想检查某个项目是否在里面,集合的速度就比列表快很多。不过,集合里只能放独一无二的项目。

其实,元组的表现和列表几乎一模一样,唯一的不同就是元组是不可改变的。

遍历

>>> def iter_test(iterable):
...     for i in iterable:
...         pass
...
>>> from timeit import timeit
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = set(range(10000))",
...     number=100000)
12.666952133178711
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = list(range(10000))",
...     number=100000)
9.917098999023438
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = tuple(range(10000))",
...     number=100000)
9.865639209747314

判断一个对象是否存在

>>> def in_test(iterable):
...     for i in range(1000):
...         if i in iterable:
...             pass
...
>>> from timeit import timeit
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = set(range(1000))",
...     number=10000)
0.5591847896575928
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = list(range(1000))",
...     number=10000)
50.18339991569519
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = tuple(range(1000))",
...     number=10000)
51.597304821014404
307

这要看你打算怎么使用它。

当你想检查一个对象是否在集合里时,集合的速度要快很多(比如说 x in s),但是集合里的元素是没有顺序的,所以你不能像在列表里那样通过索引来访问某个元素。实际上,遍历集合的速度也会稍微慢一些。

你可以使用 timeit模块 来看看在你的情况下哪个更快。

撰写回答