我怎样才能对一个函数进行数千次多处理?
How can I multiprocess a single function thousands of time?
我正在使用 OpenCV 将数千张图像与一张参考图像进行比较。这个过程非常漫长,我正在考虑将多处理作为加速它的一种方式。
我应该怎么做才能让它为每个图像执行“cv.matchTemplate(...)”函数,而不是在同一图像上循环重新执行该函数?
def myFunction():
values_for_each_image =[]
for image in thousands_of_images:
result = cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED)
values_for_each_image.append(result[1])
return values_for_each_image
理论上,我知道我可以做这样的事情(但对于成千上万的图像来说这是不现实的):
def do_image1():
return cv.matchTemplate(reference_image, image1, cv.TM_CCOEFF_NORMED)
def do_image2():
return cv.matchTemplate(reference_image, image2, cv.TM_CCOEFF_NORMED)
p1 = multiprocessing.Process(target=do_image1)
p2 = multiprocessing.Process(target=do_image2)
if __name__ == '__main__':
p1.start()
p2.start()
...
您可以使用 python 的多处理库中的 Pool,而不是单个进程。池将根据需要负责启动每个进程。
鉴于您的函数没有任何参数,我想说您可以使用池的 apply or the apply_async 函数获得最佳结果。
这就是我使用 concurrent.futures:
解决问题的方法
from concurrent.futures import ThreadPoolExecutor, as_completed
def do_image(reference_image, image):
return(cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED))
def myFunction():
values_for_each_image = []
with ThreadPoolExecutor(20) as executor:
results = {executor.submit(do_image, reference_image, image) for image in thousands_of_images}
for result in as_completed(results):
values_for_each_image.append(result.result())
return(values_for_each_image)
我正在使用 OpenCV 将数千张图像与一张参考图像进行比较。这个过程非常漫长,我正在考虑将多处理作为加速它的一种方式。
我应该怎么做才能让它为每个图像执行“cv.matchTemplate(...)”函数,而不是在同一图像上循环重新执行该函数?
def myFunction():
values_for_each_image =[]
for image in thousands_of_images:
result = cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED)
values_for_each_image.append(result[1])
return values_for_each_image
理论上,我知道我可以做这样的事情(但对于成千上万的图像来说这是不现实的):
def do_image1():
return cv.matchTemplate(reference_image, image1, cv.TM_CCOEFF_NORMED)
def do_image2():
return cv.matchTemplate(reference_image, image2, cv.TM_CCOEFF_NORMED)
p1 = multiprocessing.Process(target=do_image1)
p2 = multiprocessing.Process(target=do_image2)
if __name__ == '__main__':
p1.start()
p2.start()
...
您可以使用 python 的多处理库中的 Pool,而不是单个进程。池将根据需要负责启动每个进程。
鉴于您的函数没有任何参数,我想说您可以使用池的 apply or the apply_async 函数获得最佳结果。
这就是我使用 concurrent.futures:
解决问题的方法from concurrent.futures import ThreadPoolExecutor, as_completed
def do_image(reference_image, image):
return(cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED))
def myFunction():
values_for_each_image = []
with ThreadPoolExecutor(20) as executor:
results = {executor.submit(do_image, reference_image, image) for image in thousands_of_images}
for result in as_completed(results):
values_for_each_image.append(result.result())
return(values_for_each_image)