【发布时间】:2014-04-08 11:31:57
【问题描述】:
我在 Python 中有以下代码:
import time
import sys
def returnlist(times):
t = time.time()
l = [i for i in range(times)]
print "list: {}".format(time.time() - t)
return l
def returngenerator(times):
t = time.time()
g = (i for i in range(times))
print "generator: {}".format(time.time() - t)
return g
g = returngenerator(times)
l = returnlist(times)
1.For times = 1000000 我得到结果:
生成器:0.107323884964
列表:0.225493192673
2. For times = 10000000 我得到:
生成器:0.856524944305
列表:1.83883309364
我明白为什么创建第二个列表需要更多时间,但为什么第二个生成器也需要更多时间?我假设由于延迟评估,创建第一个生成器需要大约相同的时间。
我在 Ubuntu 虚拟机上运行这个程序
【问题讨论】:
-
你在运行 Python 2 吗?如果是这种情况,请使用
xrange而不是range。 -
@Carsten 是完全正确的,这在 python-2 中较慢的原因是
range只是在 python-3 评估完整列表之前变得懒惰(即返回一个生成器)。 -
所以我认为我不应该在 bulding 生成器中使用 range()。使用 range() 是否意味着每次要返回一个新的生成器值时,都应该再次创建整个 range() 列表?
-
另外,如果你使用'timeit'模块进行时序分析,你会更好。像这样说:import timeit; t1=timeit.Timer(setup='x=100000',stmt='(y for y in xrange(x))');t1.timeit(1000)
-
我会记住这一点的。