range函数python2和3区别_Python 2.X中的range和xrange函数之间有什么区别?

显然,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,而不是向后移植。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值