Joh*_*Doe 7 python list-comprehension list
只是想问为什么会这样(列表理解,如果我没记错的话):
def s(number):
return sum([n for n in range(number) if n%3==0 or n%5==0])
s(100)
Run Code Online (Sandbox Code Playgroud)
比这个(202 步)快两倍(108 步可视化 python):
def s(number):
return sum(n for n in range(number) if n%3==0 or n%5==0)
s(100)
Run Code Online (Sandbox Code Playgroud)
?
而且,虽然第一个代码更快,但第二个代码在任何情况下都有什么优势吗?也许,使用更少的内存?只是吐口水,真的不知道我在说什么。任何澄清将不胜感激。
您的两个片段的性能非常相似,显然并非每个步骤都是相同的。对于较小的number第一个代码(列表)值稍快,但对于较大的number第二个代码(生成器)获胜。
另一件事是内存使用 - 创建列表需要与其大小成比例的内存量,因此越大会number消耗更多的 RAM。此外,随着列表的增长,它需要内存重新分配,这最终会触发垃圾收集器(timeit()默认情况下禁用gc,破坏结果)。另一方面,生成器版本对任何number.
结论是您应该尽可能使用生成器表达式。当您关心内存占用和/或对大量数字进行操作时,这一点尤其重要。另外,这样你的代码会稍微短一些并且更干净(有争议)。
PEP 289中解释了这个主题,引入了生成器表达式。