簡體   English   中英

關於推導式與列表推導式的 Python 快速問題

[英]Python quick question about comprehensions vs list comprehensions

只是想問為什么會這樣(列表理解,如果我沒記錯的話):

def s(number):
    return sum([n for n in range(number) if n%3==0 or n%5==0])
s(100)

比這個(202 步)快兩倍(108 步可視化 python):

def s(number):
    return sum(n for n in range(number) if n%3==0 or n%5==0)
s(100)

?

而且,雖然第一個代碼更快,但第二個代碼在任何情況下都有什么優勢嗎? 也許,使用更少的內存? 只是吐口水,真的不知道我在說什么。 任何澄清將不勝感激。

您的兩個片段的性能非常相似,顯然並非每一步都是平等的。 對於較小的number值, number一個代碼(列表)稍微快一些,但對於較大的number第二個代碼(生成器)獲勝。

另一件事是內存使用 - 創建列表需要與其大小成正比的內存量,因此較大的number消耗更多的 RAM。 此外,隨着列表的增長,它需要內存重新分配,這最終會觸發垃圾收集器(默認情況下timeit()禁用gc ,修改結果)。 另一方面,生成器版本對任何number使用相同(最小)的內存量。

結論是您應該盡可能使用生成器表達式。 當您關心內存占用和/或操作大量數字時,這一點尤其重要。 此外,這樣你的代碼會更短更干凈(有爭議)。

這個主題在PEP 289 中進行了解釋,介紹了生成器表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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