Python 使用map()函数优化速度

Python 使用map()函数优化速度,python,python-2.7,image-processing,Python,Python 2.7,Image Processing,所以我现在有一个项目,我必须通过卫星图像模拟高分辨率图像。我正在用Python做这件事,我有一个程序可以工作——但是,在典型的图像大小(1200×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_tru

所以我现在有一个项目,我必须通过卫星图像模拟高分辨率图像。我正在用Python做这件事,我有一个程序可以工作——但是,在典型的图像大小(1200×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])))
在上面的例子中,myweight_values函数需要很多值。当使用映射调用它们时,给定的iterables都是相同大小的一维对象

以下是所涉及阵列的简要说明:

  • 脚部:一个三维阵列,具有尺寸、像素编号、沿轨迹和跨轨迹(最后两个是非局部的,即它们以0为中心)。这表示卫星在每个像素处的足迹。足迹基本上是每个像素内部的实际面积-我使用的是一个有大条带的仪器,这就是为什么这很重要
  • 真相:这就是我正在模拟的东西。它的分辨率与脚部相同,但覆盖了沿轨迹和跨轨迹坐标上的特定区域
map函数中称为iterables的1D数组具有屏蔽值,这就是为什么使用“no_mask”。这些数组的最大值为1800000(图像像素数),但我的代码允许我选择更小的片段进行测试

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


如果这里有什么不清楚的地方或者你不理解这个问题,也请告诉我,我会尽力让它更具可读性

我快速查看了您的
权重\u值
函数,该函数对每个像素进行平均,每个像素都有许多邻居。因此,每个相邻像素被多次读取。这在O(n^3)时间内运行。一种常见的、更快的技术是累积和。您可以从开始,尽管它是在Matlab中。python中的想法也是一样的。目标是只需计算每个像素值一次。
python版本是。

严肃的问题,你能/你试过升级到python 3.x吗?不,我现在坚持使用2.7,因为它似乎有更多的帮助,而当我开始使用python时,我对它不太满意。你认为这会对我看到的一些速度问题有所帮助吗?欢迎来到堆栈溢出!虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效。对于这样的答案,您可以根据链接对累积和算法进行最低限度的解释。您好,感谢您的回复。本质上,我的“foot_in_truth”是指找到属于我的“truth”数组范围的“foot”数组的元素,反之亦然。我的Pix_Center数组是从“foot”调用来创建“foot_in_truth”数组的,但我看不出有什么方法可以防止有时为重复的像素数创建此数组。这是因为数组“row1、row0、col1、col0”对于它们的特定元素来说都是独立的,这定义了封装外形的哪一部分。但这绝对是我要考虑的事情!