为什么Python3中没有xrange函数?

问题:

最近我开始使用Python3,并且缺少xrange的伤害。
简单的例子:
 1) 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()

 2) 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) 1.53888392448
 2) 3.215819835662842
这是为什么?我的意思是,为什么xrange被删除?这是一个很好的学习工具。对于初学者来说,就像我一样,就像我们都在某一点上一样。为什么要删除它?有人可以指出我正确的PEP,我找不到。
干杯。

回答:

使用timeit而不是手动使用time进行某些性能测量,
首先,苹果2.7.2 64位:

In [37]: %timeit collections.deque((x for x in xrange(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.05 s per loop

现在,python.org 3.3.0 64位:

In [83]: %timeit collections.deque((x for x in range(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.32 s per loop

In [84]: %timeit collections.deque((x for x in xrange(10000000) if x%4 == 0), maxlen=0)
1 loops, best of 3: 1.31 s per loop

In [85]: %timeit collections.deque((x for x in iter(range(10000000)) if x%4 == 0), maxlen=0) 
1 loops, best of 3: 1.33 s per loop

显然,3.x range确实比2.x xrange慢一些。 OP的xrange功能与此无关。 (不奇怪的是,作为对__iter__插槽的一次性调用,在循环中发生的任何事情的10000000次调用中不太可能看到,但有人将其作为可能性。)
但是只有30%的速度。 OP是如何2倍缓慢?那么如果我用32位Python重复同样的测试,我会得到1.58 vs. 3.12。所以我的猜测是,这是另一种情况,其中3.x已经针对64位性能进行了优化,从而损害了32位。
但这真的很重要吗?检查一下,再次使用3.3.0 64位:

In [86]: %timeit [x for x in range(10000000) if x%4 == 0]
1 loops, best of 3: 3.65 s per loop

因此,构建list比整个迭代的时间长两倍多。
而且“消耗比Python 2.6+更多的资源”,从我的测试来看,它似乎是一个3.x range与2.x xrange完全相同的大小,即使它是10x作为大,建立不必要的列表仍然是比任何可能的范围迭代可能做的任何事情大约10000000x的问题。
而在deque内的显式for循环而不是C循环,

In [87]: def consume(x):
   ....:     for i in x:
   ....:         pass
In [88]: %timeit consume(x for x in range(10000000) if x%4 == 0)
1 loops, best of 3: 1.85 s per loop

所以在for语句中浪费的时间几乎和迭代range的实际工作一样多
如果您担心优化范围对象的迭代,则可能是在错误的位置。
同时,你一直在问为什么xrange被删除,无论人们告诉你多少次同样的事情,但是我会重复一遍:没有被删除:它被重命名为range,而2.x range是被删除的。
这里有一些证明,3.3 range对象是2.x xrange对象(而不是2.x range函数)的直接后代:源为3.3 range2.7 xrange。你甚至可以看到change history(链接到,我相信这个更改替换了文件中任何地方的字符串“xrange”的最后一个实例)。
那么为什么会慢一些?
那么一个,他们添加了很多新功能。另一方面,他们已经做了各种各样的变化,在整个地方(特别是在迭代之内)都有轻微的副作用。而且,为了大幅优化各种重要案件,尽管有时候对于较少重要的案件有些悲观,但还是有很多工作要做。添加这一切,我并不惊讶,迭代range尽可能快现在有点慢。这是其中一个不太重要的情况之一,没有人会关心这个重点。没有人可能有一个现实生活中的使用情况,其性能差异是他们的代码的热点。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Why is there no xrange function in Python3?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

87 + = 94