生成更多结果的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

我有以下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.对于次=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)我会记住这一点。