3 回答

TA貢獻1852條經(jīng)驗 獲得超7個贊
這取決于你打算用它做什么。
在確定對象是否存在于集合中時(如在x in s)中,集合明顯更快,但在迭代其內(nèi)容時比列表慢。
您可以使用timeit模塊查看哪種情況更快。

TA貢獻1821條經(jīng)驗 獲得超6個贊
當您只想迭代值時,列表比設(shè)置略快。
但是,如果要檢查項目是否包含在內(nèi),則集合明顯快于列表。但它們只能包含唯一的項目。
事實證明,元組的表現(xiàn)幾乎與列表完全相同,除了它們的不變性。
迭代
>>> 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條經(jīng)驗 獲得超7個贊
清單表現(xiàn):
>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
0.008128150348026608
設(shè)定表現(xiàn):
>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
0.005674857488571661
您可能需要考慮元組,因為它們與列表類似但無法修改。它們占用的內(nèi)存略少,訪問速度更快。它們不像列表那樣靈活,但效率更高。它們的正常用途是作為字典鍵。
集合也是序列結(jié)構(gòu),但與列表和元組有兩個不同。雖然集合確實有訂單,但該順序是任意的,不受程序員的控制。第二個區(qū)別是集合中的元素必須是唯一的。
set根據(jù)定義。[ python | 維基 ]。
>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}
添加回答
舉報