3 回答
TA贡献1852条经验 获得超7个赞
这取决于你打算用它做什么。
在确定对象是否存在于集合中时(如在x in s)中,集合明显更快,但在迭代其内容时比列表慢。
您可以使用timeit模块查看哪种情况更快。
TA贡献1821条经验 获得超6个赞
当您只想迭代值时,列表比设置略快。
但是,如果要检查项目是否包含在内,则集合明显快于列表。但它们只能包含唯一的项目。
事实证明,元组的表现几乎与列表完全相同,除了它们的不变性。
迭代
>>> 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
TA贡献1943条经验 获得超7个赞
清单表现:
>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
0.008128150348026608
设定表现:
>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
0.005674857488571661
您可能需要考虑元组,因为它们与列表类似但无法修改。它们占用的内存略少,访问速度更快。它们不像列表那样灵活,但效率更高。它们的正常用途是作为字典键。
集合也是序列结构,但与列表和元组有两个不同。虽然集合确实有订单,但该顺序是任意的,不受程序员的控制。第二个区别是集合中的元素必须是唯一的。
set根据定义。[ python | 维基 ]。
>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}
添加回答
举报