【发布时间】:2018-09-21 08:01:12
【问题描述】:
我有以下两个功能:
def foo(n=50000):
return sum(i*i for i in range(n)) # just called sum() directly without
def bar(n=50000):
return sum([i*i for i in range(n)]) # passed constructed list to sum()
我希望foo 会比bar 运行得更快,但我已经用%%timeit 在ipython 中检查了foo 比bar 花费的时间稍长
In [2]: %%timeit
...: foo(50000)
...:
100 loops, best of 3: 4.22 ms per loop
In [3]: %%timeit
...: bar(50000)
...:
100 loops, best of 3: 3.45 ms per loop
In [4]: %%timeit
...: foo(10000000)
...:
1 loops, best of 3: 1.02 s per loop
In [5]: %%timeit
...: bar(10000000)
...:
1 loops, best of 3: 869 ms per loop
当我增加 n 的值时差异会增加,因此我尝试使用 dis.dis(foo) 和 dis.dis(bar) 检查功能,但它是相同的。
那么这两种方法之间出现这种时间差的原因是什么?
【问题讨论】:
-
抛开问题,记住在这些情况下首选使用生成器表达式的主要原因是为了提高内存使用率而不是速度优化
-
我可以发誓我们已经对这种现象有几个问题,但我找不到任何问题......
-
@IljaEverilä 不错的发现!
标签: python python-3.x