显然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 3消除了2.x的范围,并将2.x的xrange重命名为range。然而,除非您使用3.0或3.1(没有人应该使用),否则它实际上是一种不同的类型。
正如3.1文档所说:
范围对象的行为很少:它们只支持索引、迭代和len函数。
然而,在3.2+中,range是一个完整的序列,它支持扩展切片,以及collections.abc.sequence的所有方法,其语义与列表相同*
而且,至少在CPython和PyPy(目前仅有的两个3.2+实现)中,它还具有索引和计数方法以及in运算符的常量时间实现(只要只传递整数)。这意味着在r中写123456在3.2+中是合理的,而在2.7或3.1中则是一个糟糕的想法。
*issubclass(xrange,collections.Sequence)在2.6-2.7和3.0-3.1中返回True的事实是一个在3.2中修复的错误,而不是后端口。
其他回答
Range返回一个列表,而xrange返回一个xrange对象,该对象占用相同的内存,而不考虑范围大小,因为在这种情况下,每次迭代只生成一个元素并可用,而在使用Range的情况下,所有元素都会一次生成并在内存中可用。
文件清楚地写道:
此函数与range()非常相似,但返回的是xrange对象而不是列表。这是一种不透明的序列类型,它产生与相应列表相同的值,而实际上没有同时存储所有值。xrange()相对于range()的优势很小(因为xrange)仍然需要在请求时创建值),除非在内存不足的机器上使用了非常大的范围,或者从未使用过范围的所有元素(例如,循环通常以break结束)。
请参阅本文,了解range和xrange之间的差异:
引用:
range返回您所认为的结果:连续列表整数,具有以0开头的定义长度。xrange,返回一个“xrange对象”,它的行为非常像迭代器
根据扫描/打印0-N项的要求,range和xrange的工作原理如下。
range()-在内存中创建一个新列表,并获取整个0到N个项目(总共N+1个)并打印它们。xrange()-创建一个迭代器实例,该实例扫描项目并只将当前遇到的项目保存在内存中,因此始终使用相同的内存量。
如果所需的元素只是在列表的开头,那么它可以节省大量的时间和内存。
对于范围(..)/xrange(..)的较小参数,差异减小:
$ python -m timeit "for i in xrange(10111):" " for k in range(100):" " pass"
10 loops, best of 3: 59.4 msec per loop
$ python -m timeit "for i in xrange(10111):" " for k in xrange(100):" " pass"
10 loops, best of 3: 46.9 msec per loop
在这种情况下,xrange(100)的效率仅提高约20%。