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 倍于timeitfast 1.25320039 - slow 1.1005855780000002 【参考方案1】:

您正在查看分析器输出的错误列。 tottime 不会一直计算 fast_sumsum 调用或列表理解的堆栈框架内花费的时间。您应该查看cumtime,这两个函数几乎相等。

【讨论】:

以上是关于python生成器比嵌套for循环快吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

倒数比倒数快吗?

比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

比较C++在for循环中的i++和++i以及i++的O2优化的效率:++i真的比i++快吗

Python - 比 2 个嵌套 for 循环更快的东西

嵌套查询比连接查询快吗? [复制]