我在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上运行此程序
代码中的问题是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)
似乎工作.:)