显然,xrange更快,但是我不知道为什么它更快(到目前为止,除了轶事之外,还没有证据表明它更快)或除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
#1楼
根据扫描/打印0-N个项目的要求,range和xrange的工作方式如下。
range()-在内存中创建一个新列表,并将整个0到N个项目(总共N + 1个)打印出来。 xrange()-创建一个迭代器实例,该实例扫描项目并仅将当前遇到的项目保留在内存中,因此始终使用相同数量的内存。
如果所需元素只是在列表的开头,那么它可以节省大量时间和内存。
#2楼
我很震惊,没有人读doc :
此函数与range()非常相似,但是返回一个xrange对象而不是列表。 这是一种不透明的序列类型,其产生的值与对应的列表相同,而实际上并没有同时存储它们。 xrange()优于range()的优势很小(因为xrange()仍然需要在创建值时才创建值),除非在内存不足的计算机上使用了非常大的范围,或者所有范围的元素都在从未使用过(例如,当环路通常与终止break )。
#3楼
什么?
range在运行时返回静态列表。
xrange返回一个object (该object行为类似于生成器,尽管肯定不是一个生成器),并在需要时从中生成值。
什么时候使用?
如果要生成一个巨大范围(例如10亿)的列表,请使用xrange ,尤其是当您拥有像手机这样的“内存敏感系统”时。
如果要遍历列表多次,请使用range 。
PS:Python 3.x的range函数== Python 2.x的xrange函数。
#4楼
Range返回一个列表,而xrange返回一个xrange对象,无论范围大小如何,该对象都占用相同的内存,因为在这种情况下,每次迭代仅生成一个元素并且可用,而在使用range的情况下,所有元素一次生成,并且在内存中可用。
#5楼
其他一些答案提到Python 3消除了2.x的range ,并将2.x的xrange重命名为range 。 但是,除非您使用3.0或3.1(应该没有人使用),否则它实际上是一种不同的类型。
正如3.1文档所说:
范围对象的行为很少:它们仅支持索引,迭代和len函数。
但是,在3.2+中, range是一个完整序列,它支持扩展的slice和所有collections.abc.Sequence方法,其语义与list相同。 *
并且,至少在CPython和PyPy(当前仅有的两个3.2+实现)中,它还具有index和count方法以及in运算符的恒定时间实现(只要您仅将其传递为整数)。 这意味着在3.2+中用123456 in r编写123456 in r是合理的,而在2.7或3.1中则是一个可怕的想法。
*该事实issubclass(xrange, collections.Sequence)返回True在2.6-2.7和3.0-3.1是一个错误的是固定在3.2,而不是向后移植。