簡體   English   中英

哪種序列類型更適合比較,為什么? (Python)

[英]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代替settuple代替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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM