为什么Python3中没有xrange函数?

最近我开始使用Python3,它缺少xrangeharts

简单的例子:

  1. 蟒蛇2:

    从时间导入时间为t
    def count():
    st=t()
    [x表示x范围内的x(10000000),如果x%4==0]
    et=t()
    打印和打印
    计数()
    
  2. 蟒蛇3:

    从时间导入时间为t
    def x范围(x):
    返回iter(射程(x))
    def count():
    st=t()
    [x表示x范围内的x(10000000),如果x%4==0]
    et=t()
    打印(et st)
    计数()
    

结果分别是:

  1. 1.53888392448
  2. 3.215819835662842

为什么呢?我是说,为什么xrange被删除了?这是一个很好的学习工具。对于初学者来说,就像我一样,就像我们在某个时候一样。为什么要删除它?谁能给我指一下合适的政治公众人物,我找不到

一些性能度量,使用timeit而不是尝试使用time手动执行

首先,Apple 2.7.2 64位:

[37]on

:%timeit collections.deque((如果x%4==0,则x代表x范围内的x(10000000)),maxlen=0)
1圈,最好3圈:每圈1.05秒

现在,python.org 3.3.0 64位:

[83]on

:%timeit collections.deque((如果x%4==0,则x代表范围(10000000)中的x),maxlen=0)
1圈,最佳3圈:每圈1.32秒
At[84]on:%timeit collections.deque((如果x%4==0,则x代表x范围(10000000)中的x),maxlen=0)
1圈,最佳3圈:每圈1.31秒
At[85]on:%timeit collections.deque((在iter(范围(10000000))中,如果x%4==0,则x代表x),maxlen=0)
1圈,最好3圈:每圈1.33秒

显然,3.xrange确实比2.xxrange慢一点。OP的xrange功能与此无关。(毫不奇怪,对\uuu iter\uuu插槽的一次性调用不太可能在对循环中发生的任何事情的10000000次调用中可见,但有人提出了这种可能性。)

但速度只慢了30%。行动怎么会慢到2倍?好吧,如果我用32位Python重复同样的测试,我得到1.58对3.12。因此,我猜测这是3.x为64位性能而进行优化的又一种情况,其方式损害了32位的性能

但这真的重要吗?再次使用3.3.0 64位代码检查此项:

[86]on

:%timeit[x代表范围内的x(10000000),如果x%4==0]
1个回路,最佳3个:每个回路3.65秒

因此,构建列表所需的时间是整个迭代的两倍多

至于“比Python2.6+消耗更多的资源”,从我的测试来看,3.x范围与2.xxrange的大小完全相同,而且,即使它是10倍大,构建不必要的列表仍然比范围迭代可能做的任何事情都要多出大约1000000000倍的问题

那么用显式的for循环而不是deque中的C循环怎么样

[87]on

:def消耗量(x):
..:对于x中的i:
……通过
At[88]on:%时间消耗(如果x%4==0,则x代表范围(10000000)内的x)
1圈,最好3圈:每圈1.85秒

因此,在for语句中浪费的时间几乎与迭代范围的实际工作中浪费的时间一样多

如果您担心优化范围对象的迭代,那么您可能找错了地方


与此同时,你一直在问为什么xrange被删除了,不管人们告诉你多少次同样的事情,但我会重复一遍:它没有被删除:它被重命名为range,而2.xrange就是被删除的

这里有一些证据证明3.3range对象是2.xxrange对象(而不是2.xrange函数)的直接后代:3.3range和2.7xrange的源代码。您甚至可以看到更改历史记录(我相信链接到替换文件中任何位置字符串“xrange”的最后一个实例的更改)

那么,为什么要慢一点呢

首先,他们增加了很多新功能。另一方面,他们做了各种各样的改变(特别是在迭代过程中),这些改变都有轻微的副作用。而且已经有大量的工作来戏剧性地优化各种重要案例,即使有时它会稍微悲观一些不太重要的案例。把这一切加起来,我并不感到惊讶,尽可能快地迭代范围现在有点慢。这是一个不太重要的案例,没有人会关注它。没有人可能有过这样一个真实的用例,即这种性能差异是他们代码中的热点

发表评论