Python集与VS列表
在Python中,哪个数据结构更高效/更快? 假设顺序对我来说并不重要,无论如何我会检查重复项,Python集是否比Python列表慢?
这取决于你打算如何处理它。
当确定对象是否存在于集合中时,集合的速度要快得多(如同在x in s
),但是在迭代其内容时比列表要慢。
您可以使用timeit模块查看哪种情况更快。
当你想存储一些你要迭代的值时,Python的列表结构会稍微快一点。 但是,如果您要存储(唯一)值以检查它们的存在,则集合显着更快。
事实certificate,元组的执行方式与列表几乎完全一样,但是通过在创build之后删除修改它们的能力(不可变),它们使用更less的内存。
迭代
>>> 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
名单performance:
>>> import timeit >>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000) 0.008128150348026608
设定performance:
>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000) 0.005674857488571661
你可能想考虑元组,因为它们与列表类似,但不能被修改。 它们占用的内存略less,访问速度也更快。 它们并不灵活,但比列表更有效率。 他们的正常使用是作为字典键。
集合也是序列结构,但与列表和元组有两点不同。 虽然集合有顺序,但是顺序是任意的,不受程序员的控制。 第二个区别是集合中的元素必须是唯一的。
根据定义set
。 [ python | wiki ]。
>>> x = set([1, 1, 2, 2, 3, 3]) >>> x {1, 2, 3}
由于即时“包含”检查, 请 Set
胜利: https : //en.wikipedia.org/wiki/Hash_table
列表实现:通常是一个数组,靠近金属的低层,适用于迭代和元素索引的随机访问。
设置实现: https : //en.wikipedia.org/wiki/Hash_table ,它不会在列表上迭代,而是通过计算密钥中的哈希来查找元素,所以它取决于关键元素的性质和哈希function。 类似于用于字典。 我怀疑list
可能会更快,如果你有很less的元素(<5),越大的元素数越好,该set
将执行包含检查。 元素的添加和去除也很快。
注 :如果list
已经sorting,searchlist
可能会相当快,但通常情况下,一个set
更快,更简单的包含检查。