如何解决减少在Python中进行长for循环的时间
| 我这边还有一个愚蠢的问题;)以下代码段的len(x)= len(y)= 7 \'700 \'000有一些问题:from numpy import *
for k in range(len(x)):
if x[k] == xmax:
xind = -1
else:
xind = int(floor((x[k]-xmin)/xdelta))
if y[k] == ymax:
yind = -1
else:
yind = int(floor((y[k]-ymin)/ydelta))
arr = append(arr,grid[xind,yind])
除arr
和grid
外,所有变量均为浮点数或整数。 arr
是一维数组,grid
是2D数组。
我的问题是循环需要很长时间(几分钟)。谁能解释我,为什么要花这么长时间?有任何建议吗?即使我尝试将ѭ5兑换成ѭ6,也只能节省一秒钟。
谢谢。
第一次编辑
抱歉。忘了告诉我我要汇入numpy
第二次编辑
我在2D网格中有一些要点。网格的每个单元格都有一个存储的值。我必须找出该点的位置并将该值应用于新数组。那是我的问题和我的想法。
附注:如果您想更好地理解它,请看一下图片。单元格的值用不同的颜色表示。
解决方法
怎么样:
import numpy as np
xind = np.floor((x-xmin)/xdelta).astype(int)
yind = np.floor((y-ymin)/ydelta).astype(int)
xind[np.argmax(x)] = -1
yind[np.argmax(y)] = -1
arr = grid[xind,yind]
注意:如果您要使用numpy,则要高效执行操作,请勿将数组像python列表一样对待。
,for x_item,y_item in zip(x,y):
# do stuff.
如果您不想生成庞大的额外列表,也可以使用izip。
,除了数据大小,我看不到明显的问题。您的计算机是否可以将所有内容保存在内存中?否则,您可能正在交换内存中“跳来跳去”,这总是很慢的。如果完整的数据在内存中,请尝试psyco。这可能会大大加快您的计算速度。
,我怀疑问题可能出在您存储结果的方式上:
arr = append(arr,grid[xind,yind])
append
的文档说它返回:
附有values
的arr
副本
至axis
。注意ѭ11
不能就地发生:新数组是
分配和填充。
这意味着您将在每次迭代中取消分配并分配越来越大的数组。我建议预先分配一个正确大小的数组,然后在每次迭代中填充数据。例如。:
arr = empty(len(x))
for k in range(len(x)):
...
arr[k] = grid[xind,yind]
,x的长度是700万?我认为这就是原因!
迭代发生了700万次,
可能您应该进行另一种循环。
真的需要循环超过7 m次吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。