显然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()非常相似,但返回的是xrange对象而不是列表。这是一种不透明的序列类型,它产生与相应列表相同的值,而实际上没有同时存储所有值。xrange()相对于range()的优势很小(因为xrange)仍然需要在请求时创建值),除非在内存不足的机器上使用了非常大的范围,或者从未使用过范围的所有元素(例如,循环通常以break结束)。
其他回答
在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之间的差异:
引用:
range返回您所认为的结果:连续列表整数,具有以0开头的定义长度。xrange,返回一个“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,但没有对最小和最大端点的限制。
Python 2.x中的range()
该函数本质上是Python2.x中可用的旧range()函数,并返回包含指定范围内元素的列表对象的实例。
然而,当使用一系列数字初始化列表时,这种实现效率太低。例如,对于范围(1000000)中的i,无论是在内存还是时间使用方面,都是一个非常昂贵的命令,因为它需要将这个列表存储到内存中。
Python 3.x中的range()和Python 2.x中的xrange()
Python3.x引入了一个新的range()实现(而新的实现已经在Python2.x中通过xrange()函数提供)。
range()利用了一种称为惰性求值的策略。新的实现没有在范围内创建一个庞大的元素列表,而是引入了类范围,这是一个轻量级对象,表示给定范围内所需的元素,而没有将它们显式存储在内存中(这听起来可能像生成器,但惰性求值的概念不同)。
例如,考虑以下内容:
# Python 2.x
>>> a = range(10)
>>> type(a)
<type 'list'>
>>> b = xrange(10)
>>> type(b)
<type 'xrange'>
and
# Python 3.x
>>> a = range(10)
>>> type(a)
<class 'range'>
range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。
这给您带来了两个好处:
您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。