减少python中长循环的时间

时间:2011-04-13 20:15:46

标签: python for-loop numpy

我身边另一个愚蠢的问题;)我对以下代码片段有一些问题: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])

arrgrid外,所有变量都是浮点数或整数。 arr是一维数组,grid是二维数组。

我的问题是需要很长时间才能完成循环(几分钟)。任何人都可以解释一下,为什么这需要这么长时间?有人有什么建议吗?即使我尝试通过range()交换arange(),我也只会节省一些时间。

感谢。

第一次编辑 抱歉。忘了告诉我正在导入numpy

第二次编辑

我在2D网格中有一些要点。网格的每个单元格都存储了一个值。我必须找出该点所具有的位置并将该值应用于新数组。这是我的问题和我的想法。

p.s:如果你想更好地理解它,请看图片。单元格的值用不同的颜色表示。

idea

5 个答案:

答案 0 :(得分:4)

如下:

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列表。

答案 1 :(得分:1)

for x_item, y_item in zip(x, y):
    # do stuff.

如果您不想生成一个巨大的额外列表,还有izip

答案 2 :(得分:0)

除了数据大小之外,我看不出明显的问题。您的计算机能够将所有内容保存在内存中吗?如果没有,你可能会在交换内存中“跳转”,这总是很慢。如果完整数据在内存中,请尝试psyco。它可能会加速你的计算。

答案 3 :(得分:0)

我怀疑问题可能与您存储结果的方式有关:

arr = append(arr,grid[xind,yind])

The docs for append说它返回:

  

附加arr的{​​{1}}副本   到values。请注意,axis会这样做   就地不会发生:一个新阵列   分配和填充。

这意味着您将在每次迭代时释放并分配越来越大的数组。我建议在前面分配一个正确大小的数组,然后在每次迭代中用数据填充它。 e.g:

append

答案 4 :(得分:-1)

x的长度是7百万?我想那就是原因! 迭代次数达到7百万次,

可能你应该做出另一种循环。 它真的需要循环超过7米?