我希望使用例如均方误差作为比较指标,对python脚本中2个图像列表的所有排列进行图像比较。由于我的PC的cpu具有4个核心,因此我希望加快这一过程的速度,并且多处理器应该能够帮助完成此任务。但是,到目前为止,我的性能仅下降了!我认为这是因为我还没有找到仅将所需数据复制到每个进程中的好方法,并且将所有图像数据复制到每个新进程中的相关开销要大于并行化的任何好处。
下面是一个代码段,该段代码将我当前的任务单进程实现与一种多处理尝试的实现进行了比较,并受到答案here的启发)
from time import time
import numpy as np
from multiprocessing import Pool
# generate test data
im_list_1 = [np.random.random((320, 640)).astype(np.float32) for num in range(350)]
im_list_2 = [np.random.random((320, 640)).astype(np.float32) for im in range(11)]
# functions used for single process implementation
def mse(im1, im2):
return np.mean(np.square(im1 - im2))
def compare_mse(im_list_1, im_list_2):
results = np.zeros((len(im_list_1), len(im_list_2)), dtype=np.float32)
for row in np.arange(len(im_list_2)):
for col in np.arange(len(im_list_1)):
results[col, row] = mse(im_list_1[col], im_list_2[row])
return results
# functions used for multi-process implementation
def mse_worker(im1, im2):
return mse(im1, im2)
def mse_data_stream(a, b):
for i, im1 in enumerate(a):
for j, im2 in enumerate(b):
yield (i, j), (im1, im2)
def proxy(args):
return args[0], mse_worker(*args[1])
def pool_compare_mse(im_list_1, im_list_2):
pool = Pool(processes=4)
results = pool.map(proxy, mse_data_stream(im_list_1, im_list_2))
Y = np.zeros((len(im_list_1), len(im_list_2)))
for k, v in results:
Y[k[0], k[1]] = v
return Y
# test both scenarios
t_start = time()
compare_mse(im_list_1=im_list_1, im_list_2=im_list_2)
print ('single process took {} seconds'.format(time() - t_start))
t_start = time()
Y = pool_compare_mse(im_list_1, im_list_2)
print ('multi-processing took {} seconds'.format(time()-t_start))
我的问题-(如何)可以在python多处理(或类似方法)中并发执行此任务,从而获得有意义的性能?为了量化“有意义的”,将处理时间减半为3(等于1)将是一个巨大的胜利。
重要的是,结果矩阵的索引必须与输入图像列表(im_list_1,im_list_2)的顺序(即给定结果矩阵的元素(此处表示为Y))相匹配,这才有可能确定图片进行了比较。)