python生成器比嵌套for循环快吗? [关闭]
Posted
技术标签:
【中文标题】python生成器比嵌套for循环快吗? [关闭]【英文标题】:Are python generators faster than nested for loops? [closed] 【发布时间】:2019-01-26 21:03:08 【问题描述】:我在尝试理解生成器时遇到了一些问题。
执行相同任务时,这些函数的执行时间是否不同?
def slow_sum(size):
x= 0
for i in range(size):
for j in range(size):
x += i + j
return x
def fast_sum(size):
return sum( [ (i+j) for j in range(size) for i in range(size)] )
size = 2000
slow_val = slow_sum(size)
fast_val = fast_sum(size)
assert slow_val == fast_val, "Values are not equal"
当使用 cProfile 在我的计算机上分析这两个函数时,我得到了这些结果,但我希望它们是相似的。
总时间
slow_sum(2000)
0.85 毫秒fast_sum(2000)
0.05 毫秒原始文件:https://pastebin.com/fDfaSqyZ
我的输出:https://pastebin.com/wyy3v3iy
【问题讨论】:
那不是生成器,那是列表理解。使用生成器,它将是sum((i+j) for j in range(size) for i in range(size))
@Tomothy32,生成器通常不会比先创建列表快。例如见str.join
;尝试使用生成器与列表并比较结果
它对str.join
来说很特别,因为它无论如何都需要一个列表,如果没有,它会构建一个。 sum
的情况并非如此
slow_sum
必须执行单独的 Python 添加操作; fast_sum
对 C 中的列表求和。
我得到了几乎相同的速度:size = 1000
,10 倍于timeit
:fast 1.25320039 - slow 1.1005855780000002
【参考方案1】:
您正在查看分析器输出的错误列。 tottime
不会一直计算 fast_sum
在 sum
调用或列表理解的堆栈框架内花费的时间。您应该查看cumtime
,这两个函数几乎相等。
【讨论】:
以上是关于python生成器比嵌套for循环快吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗
比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗