【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
显然,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,而不是向后移植。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3146735