显然xrange更快,但我不知道为什么它更快(除了目前为止的传闻之外,没有证据表明它更快),或者除此之外还有什么不同

for i in range(0, 20):
for i in xrange(0, 20):

当前回答

此外,if do list(xrange(…))将等同于range(…)。

所以列表很慢。

而且xrange确实没有完全完成序列

这就是为什么它不是一个列表,而是一个xrange对象

其他回答

range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。

这给您带来了两个好处:

您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。

请参阅本文,了解range和xrange之间的差异:

引用:

range返回您所认为的结果:连续列表整数,具有以0开头的定义长度。xrange,返回一个“xrange对象”,它的行为非常像迭代器

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

在这个简单的示例中,您将发现xrange优于range的优势:

import timeit

t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
    pass
t2 = timeit.default_timer()

print "time taken: ", (t2-t1)  # 4.49153590202 seconds

t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
    pass
t2 = timeit.default_timer()

print "time taken: ", (t2-t1)  # 7.04547905922 seconds

在xrange的情况下,上面的示例没有反映出任何明显更好的内容。

现在看看下面的例子,与xrange相比,range真的很慢。

import timeit

t1 = timeit.default_timer()
a = 0
for i in xrange(1, 100000000):
    if i == 10000:
        break
t2 = timeit.default_timer()

print "time taken: ", (t2-t1)  # 0.000764846801758 seconds

t1 = timeit.default_timer()
a = 0
for i in range(1, 100000000):
    if i == 10000:
        break
t2 = timeit.default_timer() 

print "time taken: ", (t2-t1)  # 2.78506207466 seconds

使用range,它已经创建了一个从0到100000000的列表(耗时),但xrange是一个生成器,它只根据需要生成数字,也就是说,如果迭代继续的话。

在Python-3中,范围功能的实现与Python-2中的xrange功能的实现相同,而他们在Python-3中取消了xrange

快乐编码!!

xrange只存储范围参数并根据需要生成数字。然而,Python的C实现目前将其args限制为C longs:

xrange(2**32-1, 2**32+1)  # When long is 32 bits, OverflowError: Python int too large to convert to C long
range(2**32-1, 2**32+1)   # OK --> [4294967295L, 4294967296L]

注意,在Python3.0中只有范围,它的行为类似于2.xxrange,但没有对最小和最大端点的限制。