显然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):
当前回答
在Python 2.x中:
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个延迟求值的序列对象。
在Python 3中:
range相当于Python 2的xrange。要获得列表,必须显式使用list(range(…))。xrange不再存在。
其他回答
range会创建一个列表,所以如果您选择range(10000000),它会在内存中创建一个包含9999999个元素的列表。xrange是一个生成器,因此它是一个序列对象。
这是正确的,但在Python3中,range()将由Python2xrange()实现。如果您需要实际生成列表,则需要执行以下操作:
list(range(1,100))
从帮助文档中。
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被删除。
在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)
Range返回一个列表,而xrange返回一个xrange对象,该对象占用相同的内存,而不考虑范围大小,因为在这种情况下,每次迭代只生成一个元素并可用,而在使用Range的情况下,所有元素都会一次生成并在内存中可用。
请参阅本文,了解range和xrange之间的差异:
引用:
range返回您所认为的结果:连续列表整数,具有以0开头的定义长度。xrange,返回一个“xrange对象”,它的行为非常像迭代器