使用map()函数优化速度

时间:2018-10-30 15:05:42

标签: python python-2.7 image-processing

因此,我目前有一个项目,必须通过卫星图像模拟高分辨率图像。我正在使用Python进行此操作,并且我有一个有效的程序-但是,要在典型的图像尺寸(1200 x 1500像素)上进行仿真需要3分钟。我一直在测试代码的时间,发现这是脚本中最耗时的部分,需要3分钟(其余代码约占10秒)。

这是一部分代码:

def weight_values(Pix_center,row_0,row_1,col_0,col_1,t_row_0,t_row_1,t_col_0,t_col_1):
    foot_in_truth = foots[Pix_center,row_0:row_1,col_0:col_1]
    truth_in_foot = truth[t_row_0:t_row_1, t_col_0:t_col_1]
    weighted_vals = (foot_in_truth*truth_in_foot).sum()/foot_in_truth.sum()
    return weighted_vals

no_mask = np.where(np.ma.getmaskarray(Pix_centers) == False)
weighted_mean = np.array(map(weight_values, (Pix_centers[no_mask]),(row0[no_mask]),(row1[no_mask]),(col0[no_mask]),(col1[no_mask]),(truth_row0[no_mask]),(truth_row1[no_mask]),(truth_col0[no_mask]),(truth_col1[no_mask])))

在上面,我的 weight_values 函数具有很多值。当使用 map 调用它们时,给出的可迭代对象都是相同大小的所有一维对象。

这里是有关数组的简要说明:

  • 英尺:沿着轨道和整个轨道具有尺寸像素数的3D阵列(后两个是非本地化的,即它们的中心为0)。这代表了卫星在每个像素处的足迹。占用空间本质上是每个像素内部实际有多少面积-我正在使用一种具有大条幅的仪器,这就是为什么这很重要。
  • 真相:这就是我正在模拟的东西。它具有与英尺相同的分辨率,但是覆盖了沿轨道和跨轨道坐标的特定区域

在地图函数中作为可迭代对象调用的一维数组具有掩码值,这就是为什么使用'no_mask'的原因。这些数组的最大值为1800000(图像像素数),但是我的代码允许我选择较小的分段进行测试。

此方法有效!但是我想知道是否有任何方法可以加快速度。到目前为止,我已经尝试过使用map / lambda设置(速度慢了将近两倍),列表理解和for循环。到目前为止,在我整个180万像素样本中,这种方法是最快的。如果您对如何加快速度有任何想法,请告诉我。我将在此处发布整个代码,但其中很多都无关紧要,而且它使用本地计算机上的文件,但我不确定我是否有权共享。

也请让我知道此处是否不清楚或您不理解该问题,我将尽力使它更具可读性。

1 个答案:

答案 0 :(得分:3)

我快速浏览了您的weight_value函数,该函数对每个像素进行平均,并且每个像素有很多邻居。因此,每个相邻像素被读取多次。这需要O(n ^ 3)时间。一种常见的更快的技术是累积和。您可以从this example开始,尽管它在Matlab中。这个想法在python中是相同的。目标是您只需要计算一次每个像素值。 python版本是here