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

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

当前回答

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,但没有对最小和最大端点的限制。

其他回答

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

引用:

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

xrange返回一个迭代器,每次只在内存中保留一个数字。范围将整个数字列表保存在内存中。

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'>

记住,使用timeit模块测试哪一小段代码更快!

$ python -m timeit 'for i in range(1000000):' ' pass'
10 loops, best of 3: 90.5 msec per loop
$ python -m timeit 'for i in xrange(1000000):' ' pass'
10 loops, best of 3: 51.1 msec per loop

就我个人而言,我总是使用range(),除非我处理的是非常庞大的列表——正如你所看到的,从时间上看,对于一个百万条目的列表,额外的开销仅为0.04秒。正如Corey所指出的,在Python 3.0中,xrange()将消失,而range()无论如何都会给您带来不错的迭代器行为。

python中的xrange()和range()的工作方式与用户类似,但当我们讨论如何使用这两个函数分配内存时,就会出现不同。

当我们使用range()时,我们为它正在生成的所有变量分配内存,因此不建议与要生成的大量变量一起使用。

另一方面,xrange()一次只能生成一个特定的值,并且只能与for循环一起使用,以打印所需的所有值。