【发布时间】:2020-10-07 03:04:03
【问题描述】:
我正在尝试实现一系列统计操作,我需要帮助我的代码矢量化。
这个想法是从两个图像中提取NxN 补丁,计算这两个补丁之间的距离度量。
为此,首先我使用以下循环构造补丁:
params = []
for i in range(0,patch1.shape[0],1):
for j in range(0,patch1.shape[1],1):
window1 = np.copy(imga[i:i+N,j:j+N]).flatten()
window2 = np.copy(imgb[i:i+N,j:j+N]).flatten()
params.append((window1, window2))
print(f"We took {time()- t0:2.2f} seconds to prepare {len(params)/1e6} million patches.")
这需要大约 10 秒才能完成,我并不太关心预处理时间。下面的步骤是我要优化的步骤。
之后,为了加快处理速度,我使用了多池来计算实际结果。包含实际计算的函数如下:
@njit
def cauchy_schwartz(imga, imgb):
p, _ = np.histogram(imga, bins=10)
p = p/np.sum(p)
q, _ = np.histogram(imgb, bins=10)
q = q/np.sum(q)
n_d = np.array(np.sum(p * q))
d_d = np.array(np.sum(np.power(p, 2) * np.power(q, 2)))
return -1.0 * np.log10( n_d, d_d)
我使用这个结构来处理所有的补丁:
def f(param):
return cauchy_schwartz(*param)
with Pool(4) as p:
r = list(tqdm.tqdm(p.imap(f,params), total=len(params)))
我确信必须有更优雅的方法来执行此操作,因为如果我将整个 10Kpx x 10Kpx 图像发送到 cauchy_schwartz 函数,它会在一秒钟内处理所有内容,但使用我的方法,即使在 4 核上这需要很长时间。
我的心智模型是 blockproc 在 matlab 中的工作方式 - 我最终以这种模式编写了这段代码。如有任何关于改进此代码性能的建议,我将不胜感激。
【问题讨论】:
标签: python performance numpy scipy scientific-computing