[英]Which sequence type is better for a comparison and why? (Python)
我有一個條件,將一個 object 與其他幾個進行比較,如下所示:
if 'a' in ('a','b','c','e'):
該序列是為此目的而創建的,在 function 的其他任何地方都不存在。 考慮到它們似乎都工作相同並且列表很短,將其分組為元組、列表或集合的優點和缺點是什么? 哪個是慣用的?
使用一套,直到你有充分的理由不這樣做。 (然后使用列表。)
我會認為一組更慣用。 它更清楚地傳達了含義,因為順序無關緊要,只有成員資格。
需要明確的是,集合是一個集合,但不是“序列類型”(即使它是可迭代的),因為它在語義上是“無序的”。
為什么不使用一套?
集合只能包含可散列類型。 而且,這很重要,當您詢問集合中是否存在不可散列的類型時,它們會引發TypeError
而不是簡單地返回False
。 如果您可能在in
運算符的任一側得到不可散列的 object,那么您就不走運了。 有時您可以使用可散列元素(例如frozenset
代替set
或tuple
代替list
),有時則不能。
但是元組和列表不必 hash 它們的元素。
為什么要在元組上列出列表?
列表的主要優點是它們避免了一個元素的元組的語法怪癖。 假設您有('foo', 'bar')
,后來決定刪除'bar'
。 然后你有('foo')
。 哎呀,看看我在那里做了什么? 它實際上應該是('foo',)
。 很容易忘記逗號。 並且in
檢查仍然適用於('foo')
這樣的字符串,因為in
檢查子字符串。 這可以巧妙地改變程序的含義。 'oo'
在('foo')
中,但不在('foo',)
中。
像['foo']
這樣的單項列表沒有這個問題。 [正如 user2357112 指出的那樣,一個常量列表無論如何都會被編譯成一個元組。]
請注意,像{'a'}
這樣的單項集也沒有這個問題。 一個空的{}
是一個 dict,但這不會導致in
檢查出現任何問題,因為它也是一個空集合。
但是當只與一個元素進行比較時,可以說你應該使用==
而不是in
。
就是為了清楚起見。 現在進行微優化。 早期優化是萬惡之源。 在實際需要之前,不要以犧牲可讀性為代價進行優化。
如果不是太小,集合查找會更快,因為必須逐個檢查元組的元素,這(平均)隨着元組的大小而增長,而集合由哈希表(如字典)支持,它的開銷很小。 如果案例的分布不均勻,這意味着元組中元素的順序很重要。 平均而言,將更常見的情況放在元組中會使檢查比相反的情況快得多。
集合必須有多小才能使集合的持續開銷重要? 配置文件並查看。 性能可能會因許多因素而異。 這不僅僅是元素的數量,而是相等檢查需要多長時間,以及它們在 memory 中的位置等。
一個元組在 memory 和構造時間上的開銷都應該比另一個 collections 的開銷略小。 但是,如果編譯器可以將其加載為保存的常量值,則構造開銷並不重要。 (當所有元素本身在編譯時都保持不變時,就會發生這種情況。您可以使用dis
模塊來確認這種情況正在發生。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.