python - 集合真的比列表快吗?

标签 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

最佳答案

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

关于python - 集合真的比列表快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53529201/

相关文章:

python - 按月、年对日期列表进行分组

python - 自定义页面 404 未显示,但页面 500 正在显示

python - Tkinter:标签和按钮框架之间的空间太大

python - python列表中的索引错误

Python 终端仿真

c# - C# 应用程序的 SQlite 部分耗时太长

java - 为什么 AES 加密/解密在 Android 24+ 上慢 3 倍以上?

java - 尽管超时时间较低,但稳定数量的 HBase 请求几乎正好需要 5000 毫秒才能完成(成功)。不知道为什么

asp.net - 贵公司使用哪些工具来管理 asp.net 应用程序的应用程序性能?

javascript - jQuery:使用 .load() 加载 php 文件时,导致 XHR 完成加载随着每次加载呈指数增长