Python 2.X中range和xrange函数有什么区别?

843

显然xrange更快,但我不知道它为什么更快(并且除了到目前为止只是口头陈述的证据外没有其他证据),也不知道除了这个之外还有什么不同之处

for i in range(0, 20):
for i in xrange(0, 20):
28个回答

2

什么意思?
range 在运行时返回一个静态列表。
xrange 返回一个对象(它的行为类似于生成器,虽然它肯定不是一个生成器),从中按需生成值。

何时使用哪个?

  • 如果要生成一个巨大范围的列表,例如10亿,特别是当您拥有“内存敏感系统”(如手机)时,请使用xrange
  • 如果要多次迭代列表,请使用range

PS:Python 3.x的range函数== Python 2.x的xrange函数。


如果我理解正确的话,这就是在这里解释的方式(适用于Python 2.x):https://wiki.python.org/moin/Generators - kmario23
那么维基百科是错误的。(我不知道是谁添加并签署了那条评论的“SH”是谁。)官方文档是正确的;您可以自己测试并查看它是生成器还是序列。 - abarnert
如果你仅仅读了那个评论的第一句话,它说:“xrange(1000)是一个像生成器一样的对象(尽管它确实不是一个生成器)。”(我强调的)。但即使它没有这么说,你也会相信一个随意的SO用户的评论,而不是官方的Python文档或者你自己测试得到的结果吗? - abarnert
无论如何,它实际上根本不像生成器。序列是一种可以重复迭代的东西,因为它的__iter__返回一个新对象,它可以被索引,因为它有一个__getitem__等等。生成器是一种在迭代时被消耗的东西,因为它的__iter__返回self,它不能被索引,并且它包含一个暂停的堆栈帧,它有sendthrow方法。xrange听起来像哪一个? - abarnert
1
有趣的问题是当解释器与官方文档或其他解释器不一致时该怎么办...但幸运的是,这种情况并不经常发生... - abarnert
显示剩余2条评论

2
使用迭代器(即时生成值),返回列表。

1

当参数较小时,range(..) / 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%。

1
此外,如果执行list(xrange(...))将等同于range(...)
因此,list很慢。
此外,xrange确实没有完全完成序列。
所以它不是列表,而是一个xrange对象。

1

范围:-范围将一次性填充所有内容,这意味着范围内的每个数字都会占用内存。

xrange:-xrange类似于生成器,当您想要数字范围但不想将它们存储在内存中时,就会出现它,例如在使用for循环时。因此具有内存效率。


1

当需要扫描/打印0-N个项目时,range和xrange的工作方式如下。

range() - 在内存中创建一个新列表,取整个0到N个项目(总共N+1个)并打印它们。 xrange() - 创建一个迭代器实例,通过项目进行扫描,并仅将当前遇到的项目保存在内存中,因此始终利用相同的内存量。

如果所需元素恰好位于列表的开头,则可以节省大量时间和内存。


1
xrange 不会创建一个迭代器实例。它创建了一个 xrange 对象,该对象是可迭代的,但不是迭代器——几乎(但并非完全)像列表一样的序列。 - abarnert

1

Range 返回一个列表,而 xrange 返回一个xrange 对象,不考虑范围大小,该对象占用相同的内存。在这种情况下,每次迭代只生成并可用一个元素,而对于使用 range,所有元素一次性生成并在内存中可用。


-2

查看此文章以了解range和xrange之间的区别:

引用如下:

range返回您想要的内容:从0开始的一系列整数列表,长度已定义。xrange返回一个"xrange对象",它的行为非常像迭代器。


2
我意识到这篇文章已经有5年的历史了,但那篇文章几乎所有观点都是错误的。xrange不是一个迭代器。range返回的列表支持迭代(列表几乎就是可迭代对象的典型例子)。 xrange的整体优势并非“最小化”的。等等。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接