【发布时间】:2013-02-07 11:43:09
【问题描述】:
最近我开始使用 Python3,它缺少 xrange 很痛苦。
简单示例:
-
Python2:
from time import time as t def count(): st = t() [x for x in xrange(10000000) if x%4 == 0] et = t() print et-st count() -
Python3:
from time import time as t def xrange(x): return iter(range(x)) def count(): st = t() [x for x in xrange(10000000) if x%4 == 0] et = t() print (et-st) count()
结果分别是:
1.538883924483.215819835662842
这是为什么呢?我的意思是,为什么xrange 被删除了?这是一个很好的学习工具。对于初学者,就像我自己一样,就像我们都在某个时候一样。为什么要删除它?谁能指出正确的 PEP,我找不到。
【问题讨论】:
-
range在 Python 3.x 中是xrange在 Python 2.x 中。实际上是 Python 2.x 的range被删除了。 -
PS,你永远不应该和
time在一起。timeit除了更容易使用、更难出错以及为您重复测试之外,还可以处理您不记得甚至不知道如何处理的各种事情(例如禁用 GC),以及可以使用分辨率高数千倍的时钟。 -
另外,你为什么要测试过滤
range上x%4 == 0的时间?为什么不只测试list(xrange())与list(range()),所以尽可能少的无关工作? (例如,你怎么知道 3.x 没有更慢地执行x%4?)对于那个问题,你为什么要构建一个巨大的list,这涉及到大量的内存分配(除了速度很慢之外) , 也是令人难以置信的变量)? -
参见docs.python.org/3.0/whatsnew/3.0.html,“视图和迭代器而不是列表”部分:“range() 现在的行为类似于 xrange() 过去的行为,除了它适用于任意大小的值。后者不再存在。”因此,range 现在返回一个迭代器。
iter(range)是多余的。 -
抱歉,引用变更文档并不能让它变得非常明显。对于其他任何感到困惑并且不想阅读长期接受的答案及其所有 cmets 的人:无论您在 python 2 中使用 xrange 的什么地方,在 python 3 中使用 range。它执行 xrange 曾经做的事情,即返回一个迭代器。如果您需要列表中的结果,请执行
list(range(..))。这相当于python 2的范围。 或者换一种说法:已经重命名了范围,因为它是更好的默认值;没有必要同时拥有两者,如果您真的需要列表,请使用list(range)。.
标签: python python-3.x pep xrange