2017-05-05 59 views
1

是沒有任何理由的內存,速度或什麼的,我會想使用:的Python的3.x的列表理解VS元組發電機

tuple(i for i in range(5000)) 

代替:

[i for i in range(5000)] 

如果我沒不介意元組的不變性

+1

如果需要元組,請使用前者(或'list(range(5000) )')如果你需要一個列表。 – vaultah

+0

「tuple」或「list」之間的選擇取決於您計劃使用它而不是資源。 –

+0

除了轉換的開銷之外,元組將更小更快,因爲它缺乏使其變得可變的機制,允許快速插入等。但是轉換過程需要額外的時間(一次)。 –

回答

2

基本上,列表理解比生成器表達式更快,原因在於 其迭代在C中執行 (閱讀@Vee德拉克對此的評論)。但是在元組中使用生成器表達式的唯一原因是您希望對項目執行一些操作和/或對它們進行過濾,更重要的是您需要一個元組(因爲不可變性及其對可變對象的好處)。

畢竟可以隨時timeit代碼:

In [10]: %timeit tuple(i for i in range(5000)) 
1000 loops, best of 3: 325 µs per loop 

In [11]: %timeit [i for i in range(5000)] 
1000 loops, best of 3: 199 µs per loop 

另外請注意,正如我所說,如果你想使用內涵,你必須需要對您的項目進行操作,否則你可以直接調用函數在你的迭代器,這是更快:

In [12]: %timeit list(range(5000)) 
10000 loops, best of 3: 98.3 µs per loop 
+0

「它的迭代在C中執行」→這是關於Python的最普遍的,完全錯誤的神話之一。列表理解速度更快,因爲暫停和恢復函數的框架很慢,而不是因爲對列表理解有特別的要求。 – Veedrac

+0

@Veedrac你有任何可靠的資源嗎?因爲,據我記憶,很久以前我已經閱讀了Mark Lutz Learning Python的書。如果不是這樣的話(現在我認爲你更可能是對的),不僅如此,還有其他可能提及這種說法的着名資源需要一個嚴肅的批評。 – Kasramvd

+0

我可以通過代碼編譯這個代碼(我甚至貢獻了部分代碼),但目前在Google上找不到任何參考。我知道他們的存在是因爲我以前寫過這篇文章,但是我的Google-fu卻讓我失望。 – Veedrac

1

生成器表達式(或genexps,簡稱)在循環最好用於處理大量的數據時節省內存。將genexp擴展爲可重用的數據類型(例如列表,元組,集合)並不被認爲是好的做法。

另外請記住,Python 3中的range()與Python 2中的xrange()類似,它返回一個生成器。實際上,即使對於5000,xrange()也會更快。注意:Python 3中不存在xrange()。