繁体   English   中英

带图像卷积的低效率python并行/多处理

[英]low efficiency python parallel/multiprocessing with image convolution

在每个任务中,第一步都需要处理约500张图像,而ndimage.filters下的filter似乎仅使用1个核心。 我尝试了multiprocessing.pool和multiprocessing.process与multiprocessing.queue。 两者都有效,但运行速度比使用单个过程慢得多。 原因很可能是泡菜和开销:如果我在每个工作人员中生成伪数据,而不是将真实数据传递给每个工作人员,那么多处理确实可以极大地提高性能。

我在Windows机器上运行spyder,我会将代码传递给另一台机器上的其他人,因此重新编译python和任何低级调整都不适用。

在matlab中,卷积透明地利用了多核,并且有parfor,可以很好地处理开销。 有什么想法或建议在python中实现多处理卷积吗? 提前谢谢了!

如果任务是numpy / scipy繁重的任务,则似乎多处理是一个糟糕的选择。 我应该使用多线程而不是多处理,因为大多数numpy / scipy函数不受GIL的影响,由于开销很小,多线程的性能优于多处理。

最重要的是,多线程比单线程要快。

import Queue
import threading
import numpy as np
from scipy import ndimage    
import time

repeats = 24

def smooth_img(q,im):
    im_stack_tmp = ndimage.filters.gaussian_laplace(im, 2.)
    q.put(im_stack_tmp)


im_all = [None]*repeats
im_all_filtered = [None]*repeats

for j in range(repeats):
    im_all[j] = np.random.randn(2048,2048)

start = time.time()
for j in range(repeats):
    im_all_filtered[j] = ndimage.filters.gaussian_laplace(im_all[j], 2.)
print 'single thread: '+str(time.time()-start)


start = time.time()
q = Queue.Queue()
for im in im_all:
    t = threading.Thread(target=smooth_img, args = (q,im))
    t.daemon = True
    t.start()
for j in range(repeats):
    im_all_filtered[j] = q.get()
print 'multi thread: '+str(time.time()-start)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM