我在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上运行此程序
答案 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()
来提高性能。