为什么或者为什么不?


#1楼

另一个区别是xrange()不能支持大于C ints的数字,因此,如果要使用python内置的大数字支持来获得范围,则必须使用range()。

Python 2.7.3 (default, Jul 13 2012, 22:29:01)
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(123456787676676767676676,123456787676676767676679)
[123456787676676767676676L, 123456787676676767676677L, 123456787676676767676678L]
>>> xrange(123456787676676767676676,123456787676676767676679)
Traceback (most recent call last):File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long

Python 3没有这个问题:

Python 3.2.3 (default, Jul 14 2012, 01:01:48)
[GCC 4.7.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> range(123456787676676767676676,123456787676676767676679)
range(123456787676676767676676, 123456787676676767676679)

#2楼

xrange()效率更高,因为它不是一次生成一个对象列表,而是一次只生成一个对象。 一次只能有一个整数,而不是100个整数及其所有开销和放入它们的列表。 生成速度更快,内存使用更好,代码更高效。

除非我特别需要某件事的清单,否则我总是会喜欢xrange()


#3楼

仅在需要实际列表时,才应该使用range()不是xrange() 。 例如,当您想要修改range()返回的列表时,或者希望对其进行切片时。 对于迭代甚至普通索引, xrange()都可以正常工作(并且通常效率更高)。 对于很小的列表,有一点range()xrange()快一点,但是取决于您的硬件和各种其他细节,收支平衡的长度可能是1或2; 不用担心。 更喜欢xrange()


#4楼

出于以下原因选择范围:

1)xrange将在较新的Python版本中消失。 这样可以轻松实现将来的兼容性。

2)range将承担与xrange相关的效率。


#5楼

为了提高性能,尤其是在较大范围内进行迭代时,通常使用xrange()更好。 但是,在某些情况下,您可能更喜欢range()

  • 在python 3中, range()xrange()曾经做过的事情,而xrange()不存在。 如果要编写可在Python 2和Python 3上运行的代码,则不能使用xrange()

  • 在某些情况下, range()实际上可以更快-例如。 如果多次重复相同的序列。 xrange()每次都必须重建整数对象,但是range()将具有真实的整数对象。 (但是,在内存方面,它总是会表现得更差)

  • xrange()不适用于需要真实列表的所有情况。 例如,它不支持切片或任何列表方法。

[编辑]有几篇文章提到2to3工具将如何升级range() 。 作为记录,这是在range()xrange()一些用法示例上运行该工具的输出

RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: ws_comma
--- range_test.py (original)
+++ range_test.py (refactored)
@@ -1,7 +1,7 @@for x in range(20):
-    a=range(20)
+    a=list(range(20))b=list(range(20))c=[x for x in range(20)]d=(x for x in range(20))
-    e=xrange(20)
+    e=range(20)

如您所见,在for循环或理解中使用时,或已经用list()包装的地方,范围保持不变。


#6楼

range()返回一个列表,xrange()返回一个xrange对象。

xrange()更快,内存使用效率更高。 但是收益不是很大。

列表使用的额外内存当然不只是浪费,列表还具有更多功能(切片,重复,插入等)。 确切的差异可以在文档中找到。 没有硬性规定,请使用所需的。

Python 3.0仍在开发中,但是IIRC range()与2.X的xrange()非常相似,并且list(range())可用于生成列表。


#7楼

好的,对于xrange与range的权衡和优势,每个人都有不同的看法。 它们大体上是正确的,xrange是一个迭代器,range充实并创建实际列表。 在大多数情况下,您不会真正注意到两者之间的差异。 (您可以将map与range一起使用,但不能与xrange一起使用,但是会占用更多内存。)

但是,我认为您希望聚会中听到的是,首选是xrange。 由于Python 3中的range是一个迭代器,因此代码转换工具2to3会将xrange的所有用法正确转换为range,并会针对range的使用抛出错误或警告。 如果要确保将来轻松转换代码,则仅使用xrange,并在确定需要列表时使用list(xrange)。 我是在今年(2008年)在芝加哥PyCon上进行的CPython冲刺中学到的。


#8楼

不,它们都有各自的用途:

迭代时使用xrange() ,因为它可以节省内存。 说:

for x in xrange(1, one_zillion):

而不是:

for x in range(1, one_zillion):

另一方面,如果您实际上想要一个数字列表,请使用range()

multiples_of_seven = range(7,100,7)
print "Multiples of seven < 100: ", multiples_of_seven

#9楼

书中的一个很好的例子:Magnus Lie Hetland的实用Python

>>> zip(range(5), xrange(100000000))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]

我不建议在前面的示例中使用range而不是xrange -尽管只需要前五个数字,但range会计算所有数字,这可能会花费很多时间。 使用xrange,这不是问题,因为它仅计算所需的那些数字。

是的,我读了@Brian的答案:在python 3中,无论如何range()都是生成器,而xrange()不存在。


#10楼

  • range()range(1, 10)返回一个1到10个数字的列表,并将整个列表保存在内存中。
  • xrange() :类似于range() ,但不返回列表,而是返回一个对象,该对象根据需要生成范围内的数字。 对于循环,这比range()快一点,并且内存效率更高。 xrange()对象类似于迭代器,并按需生成数字(惰性评估)。
In [1]: range(1,10)
Out[1]: [1, 2, 3, 4, 5, 6, 7, 8, 9]In [2]: xrange(10)
Out[2]: xrange(10)In [3]: print xrange.__doc__
Out[3]: xrange([start,] stop[, step]) -> xrange object

range()与Python 3中的xrange()相同,并且Python 3中没有xrange()术语。如果多次迭代同一序列, range()实际上在某些情况下会更快。 xrange()每次都必须重建整数对象,但是range()将具有真实的整数对象。


#11楼

尽管在大多数情况下, xrange的速度比range快,但性能差异却很小。 下面的小程序比较了在rangexrange迭代:

import timeit
# Try various list sizes.
for list_len in [1, 10, 100, 1000, 10000, 100000, 1000000]:# Time doing a range and an xrange.rtime = timeit.timeit('a=0;\nfor n in range(%d): a += n'%list_len, number=1000)xrtime = timeit.timeit('a=0;\nfor n in xrange(%d): a += n'%list_len, number=1000)# Print the resultprint "Loop list of len %d: range=%.4f, xrange=%.4f"%(list_len, rtime, xrtime)

下面的结果表明, xrange的确更快,但不足以使您汗流over xrange

Loop list of len 1: range=0.0003, xrange=0.0003
Loop list of len 10: range=0.0013, xrange=0.0011
Loop list of len 100: range=0.0068, xrange=0.0034
Loop list of len 1000: range=0.0609, xrange=0.0438
Loop list of len 10000: range=0.5527, xrange=0.5266
Loop list of len 100000: range=10.1666, xrange=7.8481
Loop list of len 1000000: range=168.3425, xrange=155.8719

因此,请xrange使用xrange ,但是除非您使用的是受限硬件,否则请不要对此太担心。


#12楼

我只想说,获取具有切片和索引功能的xrange对象并不难。 我编写了一些代码,这些代码相当有效,并且在计数(迭代)时与xrange一样快。

from __future__ import divisiondef read_xrange(xrange_object):# returns the xrange object's start, stop, and stepstart = xrange_object[0]if len(xrange_object) > 1:step = xrange_object[1] - xrange_object[0]else:step = 1stop = xrange_object[-1] + stepreturn start, stop, stepclass Xrange(object):''' creates an xrange-like object that supports slicing and indexing.ex: a = Xrange(20)a.index(10)will workAlso a[:5]will return another Xrange object with the specified attributesAlso allows for the conversion from an existing xrange object'''def __init__(self, *inputs):# allow inputs of xrange objectsif len(inputs) == 1:test, = inputsif type(test) == xrange:self.xrange = testself.start, self.stop, self.step = read_xrange(test)return# or create one from start, stop, stepself.start, self.step = 0, Noneif len(inputs) == 1:self.stop, = inputselif len(inputs) == 2:self.start, self.stop = inputselif len(inputs) == 3:self.start, self.stop, self.step = inputselse:raise ValueError(inputs)self.xrange = xrange(self.start, self.stop, self.step)def __iter__(self):return iter(self.xrange)def __getitem__(self, item):if type(item) is int:if item < 0:item += len(self)return self.xrange[item]if type(item) is slice:# get the indexes, and then convert to the numberstart, stop, step = item.start, item.stop, item.stepstart = start if start != None else 0 # convert start = None to start = 0if start < 0:start += startstart = self[start]if start < 0: raise IndexError(item)step = (self.step if self.step != None else 1) * (step if step != None else 1)stop = stop if stop is not None else self.xrange[-1]if stop < 0:stop += stopstop = self[stop]stop = stopif stop > self.stop:raise IndexErrorif start < self.start:raise IndexErrorreturn Xrange(start, stop, step)def index(self, value):error = ValueError('object.index({0}): {0} not in object'.format(value))index = (value - self.start)/self.stepif index % 1 != 0:raise errorindex = int(index)try:self.xrange[index]except (IndexError, TypeError):raise errorreturn indexdef __len__(self):return len(self.xrange)

老实说,我认为整个问题有点傻,无论如何xrange都应该做所有这一切……

您是否应该始终偏爱xrange()而不是range()?相关推荐

  1. 如何将列表分成大小均匀的块?

    我有一个任意长度的列表,我需要将其分成相等大小的块并对其进行操作. 有一些明显的方法可以做到这一点,例如保留一个计数器和两个列表,当第二个列表填满时,将其添加到第一个列表中,并为第二轮数据清空第二个列 ...

  2. Python编程规范及性能优化

    为什么80%的码农都做不了架构师?>>>    Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器 ...

  3. web框架总结(django、flask)

    1.MVC解读 M:Model,模型,和数据库进行交互 V:View,视图,负责产生Html页面 C:Controller,控制器,接收请求,进行处理,与M和V进行交互,返回应答. 1.用户点击注 2 ...

  4. python基础===Python 代码优化常见技巧

    Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 8 ...

  5. 如何获取NumPy数组中N个最大值的索引?

    本文翻译自:How do I get indices of N maximum values in a NumPy array? NumPy proposes a way to get the ind ...

  6. 提高Python运行效率的6大技巧!

    Python是一门优秀的语言,它能让你在短时间内通过极少量代码就能完成许多操作.不仅如此,它还轻松支持多任务处理,比如多进程. 不喜欢Python的人经常会吐嘈Python运行太慢.但是,事实并非如此 ...

  7. bd5.2 Django

    1.Django 创建项目的命令? django-admin startproject 项目名称 python manage.py startapp 应 用 app 名 2.Django创建项目后,项 ...

  8. Python 常见优化技巧,让你的程序溜溜的跑起来!

    代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化.扩展以及文档相关的事情通常需要消耗 80% 的工作量.优化通常包含两方 ...

  9. python中if的效率_Python 代码性能优化技巧

    选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...

最新文章

  1. Spring JdbcTemplate方法详解
  2. ML_SVM的菜鸟实现
  3. oracle-sqlloader的简单使用
  4. hdu 2544 dijkstra
  5. SessionStorage 和 LocalStorage 生命周期 以及 浏览器刷新操作意味着什么?
  6. 淘宝应对双11的技术架构分析
  7. nginx负载均衡常用的策略
  8. 【ZJOF】用来个栈来实现一个队列
  9. Spark MaprLab-Auction Data分析
  10. 电脑键盘中英文按键有哪些?有什么作用?
  11. 1009 产生数 2002年NOIP全国联赛普及组
  12. 飞鸽传书:摆一摆自己的C++程序设计入行历程
  13. php 枚举类型比较,PHP 枚举类型的管理与设计知识点总结
  14. PHP(四)运算符、表达式和语句
  15. 英语翻译:英汉翻译时的对应问题
  16. MIMO系列之分集与复用
  17. 跨专业计算机 调剂,考研调剂可以跨专业调剂吗
  18. 首次发布!中国四维发布国内首个干涉SAR商业卫星星座数据产品
  19. 简述数学建模的过程_数学建模的一般步骤
  20. Power BI 关于日期显示格式的那些事儿

热门文章

  1. 安测云验证有CTA问题
  2. Retrofit 入门和提高
  3. C++写#pragma warning(disable 4786)的作用
  4. Android之一起玩转下拉刷新控件
  5. iOS 减少编译时间
  6. 用单片机测量流体流速的_曹阳等:钻井用节流阀抗冲蚀性能的实验评价
  7. PINVOKE.NET: Do interop the wiki way!
  8. JDk8的新特性-流和内部iteration
  9. django-Modelform
  10. JetBrains产品永久破解