集合真的比列表快吗?

sen*_*en_ 2 python performance

有人告诉我,在成员资格测试方面,Python 集合比列表更快。

尽管如此,timeit表明对于大量值列表实际上更快。

对于具有更多重复的较小集合,差异更小甚至相反,但是集合仍然没有显着优势(我猜性能问题对于非常大的数据集更为重要,不是吗?)

如何解释这些数据?

>>> import timeit
>>> # Few repetitions on a bigger set:
>>> timeit.timeit('10000 in set(range(10000000))', number=10)
9.265543753999737
>>> timeit.timeit('10000 in list(range(10000000))', number=10)
4.788996731000225
>>> # More repetitions on a smaller set:
>>> timeit.timeit('10000 in set(range(10000))', number=100000)
32.068307194000226
>>> timeit.timeit('10000 in list(range(10000))', number=100000)
32.45919990500079
Run Code Online (Sandbox Code Playgroud)

小智 5

你被告知是正确的,在一个集合中搜索是 O(1),因为成员是使用哈希表存储的。在(未排序的)数组中搜索是 O(n)。

您的测试的问题在于您既要创建集合/数组,又要在同一行中搜索它。在本例中,您既要测试插入所有项目的速度,又要测试单个条目的速度。

试试这样的:

test_range = range(10000000)
test_set = set(test_range)
test_array = list(test_range)

timeit.timeit('10000 in test_set', number=10)
timeit.timeit('10000 in test_array', number=10)
Run Code Online (Sandbox Code Playgroud)

  • 对于 Python *lists*,无论是否排序,搜索仍然是 O(N)。`in` 运算符的实现不会在二分搜索/线性搜索之间进行选择,它总是进行线性搜索 (2认同)