如果你总是喜欢xrange()超过范围()?
为什么或者为什么不?
为了提高性能,特别是在迭代大范围时, 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()包装的地方,范围保持不变。
不,他们都有他们的用途:
迭代时使用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
只有当你需要一个实际的列表时,你应该偏好range()
不是xrange()
。 例如,当你想修改由range()
返回的列表,或者当你希望对它进行分片时。 对于迭代或甚至只是正常的索引, xrange()
将正常工作(通常效率更高)。 对于非常小的列表, range()
比xrange()
快一点,但取决于您的硬件和各种其他细节,收支平衡可以是长度为1或2的结果; 不要担心。 喜欢xrange()
。