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



在每个任务中,我有~500张图像作为第一步进行卷积,似乎ndimage.filters下的过滤器只使用1个内核。我已经尝试过multiprocessing.pool和multiprocessing.process与multiprocessing.queue。两者都有效,但运行速度比使用单个进程慢得多。原因很可能是泡菜和开销:如果我在每个工作线程中生成虚假数据而不是将真实数据传递给每个工作线程,那么多处理确实大大提高了性能。

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

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

如果任务很重/繁重,那么多处理似乎是一个糟糕的选择。我应该使用多线程而不是多处理,因为大多数 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))

相关内容

  • 没有找到相关文章

最新更新