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

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

当前回答

从帮助文档中。

Python 2.7.12

>>> print range.__doc__
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers

Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!
These are exactly the valid indices for a list of 4 elements.

>>> print xrange.__doc__
xrange(stop) -> xrange object
xrange(start, stop[, step]) -> xrange object

Like range(), but instead of returning a list, returns an object that
generates the numbers in the range on demand.  For looping, this is 
slightly faster than range() and more memory efficient.

Python 3.5.2

>>> print(range.__doc__)
range(stop) -> range object
range(start, stop[, step]) -> range object

Return an object that produces a sequence of integers from start (inclusive)
to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.
start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.
These are exactly the valid indices for a list of 4 elements.
When step is given, it specifies the increment (or decrement).

>>> print(xrange.__doc__)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'xrange' is not defined

差异显而易见。在Python2.x中,range返回一个列表,xrange返回一个可迭代的xrange对象。

在Python3.x中,range变为Python2.x的xrange,xrange被删除。

其他回答

文件清楚地写道:

此函数与range()非常相似,但返回的是xrange对象而不是列表。这是一种不透明的序列类型,它产生与相应列表相同的值,而实际上没有同时存储所有值。xrange()相对于range()的优势很小(因为xrange)仍然需要在请求时创建值),除非在内存不足的机器上使用了非常大的范围,或者从未使用过范围的所有元素(例如,循环通常以break结束)。

对于范围(..)/xrange(..)的较小参数,差异减小:

$ python -m timeit "for i in xrange(10111):" " for k in range(100):" "  pass"
10 loops, best of 3: 59.4 msec per loop

$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" "  pass"
10 loops, best of 3: 46.9 msec per loop

在这种情况下,xrange(100)的效率仅提高约20%。

range生成整个列表并返回它。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)

每个人都对它进行了大量的解释。但我想让它自己看。我用蟒蛇。因此,我打开了资源监视器(在Windows!中),首先执行了以下命令:

a=0
for i in range(1,100000):
    a=a+i

然后检查“正在使用”内存中的更改。这是微不足道的。然后,我运行了以下代码:

for i in list(range(1,100000)):
    a=a+i

它立即占用了大量内存。我确信。你可以自己试试。

如果您使用的是Python 2X,那么在第一段代码中,将“range()”替换为“xrange()”,将“list(range())”替换成“range()”。