显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
当前回答
xrange返回一个迭代器,每次只在内存中保留一个数字。范围将整个数字列表保存在内存中。
其他回答
Range返回一个列表,而xrange返回一个xrange对象,该对象占用相同的内存,而不考虑范围大小,因为在这种情况下,每次迭代只生成一个元素并可用,而在使用Range的情况下,所有元素都会一次生成并在内存中可用。
在python 2.x中
range(x)返回一个列表,该列表是在内存中用x元素创建的。
>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]
xrange(x)返回一个xrange对象,它是一个生成器obj,可以根据需要生成数字。它们是在for循环(惰性评估)期间计算的。
对于循环,这比range()稍快,内存效率更高。
>>> b = xrange(5)
>>> b
xrange(5)
在Python 2.x中:
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个延迟求值的序列对象。
在Python 3中:
range相当于Python 2的xrange。要获得列表,必须显式使用list(range(…))。xrange不再存在。
当在一个循环中测试range和xrange时(我知道我应该使用timeit,但这是使用一个简单的列表理解示例从内存中快速删除的),我发现如下:
import time
for x in range(1, 10):
t = time.time()
[v*10 for v in range(1, 10000)]
print "range: %.4f" % ((time.time()-t)*100)
t = time.time()
[v*10 for v in xrange(1, 10000)]
print "xrange: %.4f" % ((time.time()-t)*100)
其给出:
$python range_tests.py
range: 0.4273
xrange: 0.3733
range: 0.3881
xrange: 0.3507
range: 0.3712
xrange: 0.3565
range: 0.4031
xrange: 0.3558
range: 0.3714
xrange: 0.3520
range: 0.3834
xrange: 0.3546
range: 0.3717
xrange: 0.3511
range: 0.3745
xrange: 0.3523
range: 0.3858
xrange: 0.3997 <- garbage collection?
或者,在for循环中使用xrange:
range: 0.4172
xrange: 0.3701
range: 0.3840
xrange: 0.3547
range: 0.3830
xrange: 0.3862 <- garbage collection?
range: 0.4019
xrange: 0.3532
range: 0.3738
xrange: 0.3726
range: 0.3762
xrange: 0.3533
range: 0.3710
xrange: 0.3509
range: 0.3738
xrange: 0.3512
range: 0.3703
xrange: 0.3509
我的代码段测试是否正确?对xrange的较慢实例有何评论?或者更好的例子:-)
这是出于优化的原因。
range()将创建从开始到结束的值列表(示例中为0..20)。这将成为非常大范围的昂贵操作。
另一方面,xrange()更为优化。它只会在需要时(通过xrange序列对象)计算下一个值,不会像range()那样创建所有值的列表。