生成更多结果的Python生成器需要更多的时间来创建
我有以下Python代码:生成更多结果的Python生成器需要更多的时间来创建,python,generator,Python,Generator,我有以下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 ra
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.对于次=1000000,我得到的结果是:
发电机:0.107323884964
名单:0.225493192673
2.对于次=10000000,我得到:
发电机:0.856524944305
名单:1.83883309364
我理解为什么第二个列表需要更多的时间来创建,但为什么第二个生成器也需要更多的时间?我假设由于延迟评估,创建第一个生成器所需的时间大致相同
我在Ubuntu虚拟机上运行这个程序,因为
range()
返回Python 2中的实际列表。在Python3中,对其进行了更改,使range()
成为一个生成器。在Python 2中使用xrange()
来提高性能。代码中的问题是函数。在Python 2中,它创建了一个列表。对于大型列表(如基准测试中的列表),这将成为一个问题。在Python3中,range
返回一个生成器。Python2的一个变通方法是使用该函数,该函数也是惰性的
作为测试,让我们创建一个与您类似的基准函数,但使用xrange:
def returngenerator2(times):
t = time.time()
g = (i for i in xrange(times))
print "generator2: {}".format(time.time() - t)
return g
并测试它:
>>> l = returnlist(10**7)
list: 0.580000162125
>>> g = returngenerator(10**7)
generator: 0.115000009537
>>> x = returngenerator2(10**7)
generator2: 0.0
>>> x2 = returngenerator2(10**8)
generator2: 0.0
>>> x3 = returngenerator2(10**9)
generator2: 0.0
似乎有效。:) 您正在运行Python 2吗?如果是这样的话,那么使用
xrange
而不是range
@Carsten是完全正确的,在python-2中这一速度较慢的原因是range
在python-3计算完整列表之前只是变得懒惰(即返回一个生成器)。因此我认为我不应该在构建生成器时使用range()。使用range()是否意味着每次返回一个新的生成器值时,都应该重新创建整个range()列表?另外,如果使用“timeit”模块进行计时分析,您会感觉更好。比如说:导入timeit;t1=timeit.Timer(setup='x=100000',stmt='(y表示x范围(x))中的y);t1.timeit(1000)我会记住这一点。