Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 集合真的比列表快吗?_Python_Performance - Fatal编程技术网

Python 集合真的比列表快吗?

Python 集合真的比列表快吗?,python,performance,Python,Performance,有人告诉我,当涉及到成员资格测试时,Python集比列表更快 尽管如此,timeit显示,对于大量的值,列表实际上更快 对于重复次数较多的较小集合,差异较小,甚至相反,但对集合来说仍然没有显著的优势(我猜性能问题对于非常大的数据集更为重要,不是吗?) 如何解释这些数据 >>> import timeit >>> # Few repetitions on a bigger set: >>> timeit.timeit('10000 in set

有人告诉我,当涉及到成员资格测试时,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

您被告知的是正确的,在集合中搜索是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)

set
s在您构建它们之后速度更快-从计时中扣除这一点您包括了创建时间、
set(range(10000000))
list(range(10000000))
,这是控制计时的因素,您需要隔离成员资格测试,看看有什么真正更好如果您只做一个成员资格测试,构建一个
set
可能不是前进的方向,但是如果您做了很多测试,那么您希望构建一个
set
first@Chris_Rands在这种情况下,
范围
的成员资格测试是最快的@对于这个人为的例子,juanpa.arrivillaga是(在Python3中),对于Python列表,无论排序与否,搜索仍然是O(N)。
中的
运算符的实现不会在二进制搜索/线性搜索之间进行选择,它总是进行线性搜索谢谢!我尝试了一个稍有不同的代码(因为
timeit
不接受任何超出其参数范围的内容),结果当然非常有利于集合。我只是不喜欢把事情想当然。现在要阅读有关哈希表的内容:)