产生更多结果的Python Generator需要更多时间来创建

Geo*_*geG 5 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 range(times))
    print "generator: {}".format(time.time() - t)
    return g

g = returngenerator(times)
l = returnlist(times)
Run Code Online (Sandbox Code Playgroud)

1.对于时间= 1000000我得到的结果:

发电机:0.107323884964

清单:0.225493192673

2.时间= 10000000我得到:

发电机:0.856524944305

清单:1.83883309364

我理解为什么第二个列表会花费更多时间来创建,但为什么第二个生成器会花费更多时间呢?我认为由于懒惰的评估,创建第一个生成器需要大约相同的时间.

我在Ubuntu VM上运行此程序

Car*_*ten 5

代码中的问题是range函数.在Python 2中,它创建了一个列表.对于像您的基准测试中那样的大型列表,这就成了一个问题.在Python 3中,range返回一个生成器.Python 2的解决方法是使用该xrange函数,该函数也是惰性的.

作为测试,让我们创建一个像你的基准函数,但使用xrange:

def returngenerator2(times):
    t = time.time()
    g = (i for i in xrange(times))
    print "generator2: {}".format(time.time() - t)
    return g
Run Code Online (Sandbox Code Playgroud)

并测试它:

>>> 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
Run Code Online (Sandbox Code Playgroud)

似乎工作.:)