- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
最近我开始使用 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.53888392448
3.215819835662842
这是为什么呢?我的意思是,为什么 xrange
已被删除?这是一个很好的学习工具。对于初学者,就像我自己一样,就像我们都在某个时候一样。为什么要删除它?谁能给我指出正确的 PEP,我找不到。
最佳答案
一些性能测量,使用 timeit
而不是尝试使用 time
手动进行。
首先,Apple 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 与 3.12。所以我的猜测是,这是 3.x 以损害 32 位的方式针对 64 位性能进行优化的又一个案例。
但这真的重要吗?检查一下,再次使用 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 的大小完全相同
——而且,即使它有 10 倍大,构建不必要的列表仍然比范围迭代可能做的任何事情都要多 10000000 倍。
那么显式 for
循环而不是 deque
中的 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 range
的来源和 2.7 xrange
.你甚至可以看到change history (链接到,我相信,替换文件中任何地方的字符串“xrange”的最后一个实例的更改)。
那么,为什么它变慢了?
首先,他们添加了许多新功能。另一方面,他们在整个地方(尤其是内部迭代)进行了各种具有轻微副作用的更改。并且已经做了很多工作来显着优化各种重要的案例,即使它有时会略微悲观不太重要的案例。把这一切加起来,我并不感到惊讶的是,尽可能快地迭代 range
现在有点慢。这是没有人会足够关注的次要案例之一。没有人可能会遇到这样的实际用例,其中这种性能差异是他们代码中的热点。
关于python - 为什么 Python3 中没有 xrange 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15014310/
在下面的代码片段中, if evaluation_data: n_data = len(evaluation_data) n = len(training_data) eval
我正在从传感器捕获数据,并将其输出到 .dat 文件中。我想使用 gnuplot 将此信息导出到绘图中,并使其完全自主地仅显示最近 7 天收集的数据(没有对日期进行硬编码,应使用 time() 函数根
我尝试绘制一个包含 YEAR-MONTH-DAY HOUR 格式的时间戳的文件和一个由制表符分隔的正整数。 GNUPlot 似乎无法提取给定文件的开始结束时间告诉我 Warning: empty x
这个问题已经有答案了: Why doesn't modifying the iteration variable affect subsequent iterations? (10 个回答) 已关闭
片段 xi = xrange(10) zip(xi,xi) 和 xi = iter(range(10)) zip(xi,xi) 行为不同。我希望得到 [(0, 1), (2, 3), (4
我想创建一个 Highcharts xrange 图表,其中仅显示适合框/范围的数据标签。这可能吗? 目前,标签不会重叠,但在不适合时会显示在框外。 我尝试使用 xrange.dataLabels 选
我想创建一个 xrange highcharts。据此demo ,他们使用 UTC 格式创建日期,但我从 MySQL 的 json 输出是这样的 [{"y":1,"x":"2018-01-19 08:
我不确定标题的措辞是否正确,但我想做的是找到 xrange() 传递的值的总和。 理想情况下,它看起来像这样:(注意,这不是工作代码) mofthree = xrange(2, 1000, 3) mo
在 Python 中,迭代时使用 xrange() 而不是 range 更节省内存。 我遇到的问题是我想遍历一个大列表——因此我需要使用 xrange() 然后我想检查任意元素。 使用 range()
我在尝试在网络应用程序中显示 Xrange 图表时遇到问题。 一切正常,直到我尝试缩放图表并且数据输入的极端之一落在视口(viewport)之外,从那时起图形表示就不再显示。 chart: {
我想像下面这样显示我的图表。我为此使用了“xrange”类型的 Highcharts 。我正在尝试为每个数据点显示一个事件,其中将有一个开始数据和一个结束日期。 到目前为止,我能够使用 xrange
我有一个 xrange highchart,其中有一个系列,其中一些数据点具有重叠值。当鼠标指针悬停在特定数据点上时,我需要获取重叠数据点的值一次。我尝试使用系列 mouseover 事件,但从中我只
我正在尝试使用 ctypes 从内部 python 结构中提取数据。也就是说,我正在尝试读取 xrange 中的 4 个字段: typedef struct { PyObject_HEAD
为什么 zip(*[xrange(5)]*2) 给出 [(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)] 但是 zip(*[iter(xrange(5))]*2) 给出
我是python和django的新手。我的django在我的机器上正常运行,直到安装django-haystack。我直接从github下载django-haystack.zip,并在haystack
我正在使用此 jsfiddle 创建一个 xrange Highcharts 作为引用。 如何将值传递给列表中的“x”、“x2”、“y”值? 对于普通的柱形图/条形图,我会执行以下操作,效果很好。 v
操作 myInput 字符串以获得 myOutput 字符串的更快方法是什么? myInput = "1,3-5,7" myOutput = "1,3,4,5,7" 最佳答案 re.sub(
这个问题在这里已经有了答案: How do I concatenate two lists in Python? (31 个答案) 关闭 6 年前。 我有这个正在工作的数组: urls = [
我编写了以下代码来在文本文件中定义 4 行的 block ,如果 block 的第 2 行仅由一种字符组成,则输出该 block 。假设(并且之前已验证)第 2 行始终由 36 个字符的字符串组成。
出于好奇,我用 Python 编写了 3 个测试并使用 timeit 将它们超时: import timeit # simple range based on generator def my_ran
我是一名优秀的程序员,十分优秀!