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

时间:2014-04-08 11:31:57

标签: 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)

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

  

generator:0.107323884964

     

列表:0.225493192673

2.对于时间= 10000000我得到:

  

generator:0.856524944305

     

列表:1.83883309364

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

我在Ubuntu VM上运行此程序

2 个答案:

答案 0 :(得分: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

测试一下:

>>> 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

似乎工作。 :)

答案 1 :(得分:0)

因为range()在Python 2中返回一个实际的列表。在python 3中,这已被更改,因此range()是一个生成器。在Python 2中使用xrange()来提高性能。