显然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):
当前回答
range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。
这给您带来了两个好处:
您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。
其他回答
每个人都对它进行了大量的解释。但我想让它自己看。我用蟒蛇。因此,我打开了资源监视器(在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()”。
从帮助文档中。
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)
根据扫描/打印0-N项的要求,range和xrange的工作原理如下。
range()-在内存中创建一个新列表,并获取整个0到N个项目(总共N+1个)并打印它们。xrange()-创建一个迭代器实例,该实例扫描项目并只将当前遇到的项目保存在内存中,因此始终使用相同的内存量。
如果所需的元素只是在列表的开头,那么它可以节省大量的时间和内存。
python中的xrange()和range()的工作方式与用户类似,但当我们讨论如何使用这两个函数分配内存时,就会出现不同。
当我们使用range()时,我们为它正在生成的所有变量分配内存,因此不建议与要生成的大量变量一起使用。
另一方面,xrange()一次只能生成一个特定的值,并且只能与for循环一起使用,以打印所需的所有值。