微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

减少在Python中进行长for循环的时间

如何解决减少在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 举报,一经查实,本站将立刻删除。