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

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

当前回答

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

其他回答

在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))

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

此外,if do list(xrange(…))将等同于range(…)。

所以列表很慢。

而且xrange确实没有完全完成序列

这就是为什么它不是一个列表,而是一个xrange对象

range创建一个列表,所以如果您使用range(10000000),它将在内存中创建一个包含10000000个元素的列表。xrange是一个生成器,因此它的求值是惰性的。

这给您带来了两个好处:

您可以在不出现MemoryError的情况下迭代更长的列表。由于它懒洋洋地解析每个数字,如果您提前停止迭代,就不会浪费时间创建整个列表。