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

时间:2017-04-11 17:33:32

标签: python parallel-processing multiprocessing pickle convolution

在每个任务中,我有〜500个图像作为第一步进行卷积,似乎ndimage.filters下的过滤器仅使用1个核心。我尝试过multiprocessing.pool和multiprocessing.process with multiprocessing.queue。两者都工作但运行速度比使用单一流程慢得多。原因很可能是腌制和开销:如果我在每个工人中生成虚假数据而不是将实际数据传递给每个工人,多处理确实提高了性能。

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

在matlab中,卷积透明地使用多核,并且有parfor,它可以很好地处理开销。有任何想法或建议在python中实现多处理卷积吗?非常感谢提前!

1 个答案:

答案 0 :(得分:0)

如果任务是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)