图像卷积效率低 python parallel/multiprocessing
low efficiency python parallel/multiprocessing with image convolution
在每个任务中,我有大约 500 张图像作为第一步进行卷积,ndimage.filters 下的过滤器似乎只使用 1 个核心。我用 multiprocessing.queue 试过 multiprocessing.pool 和 multiprocessing.process。两者都有效,但 运行 比使用单一进程慢得多。原因很可能是 pickle 和开销:如果我在每个 worker 中生成假数据而不是将真实数据传递给每个 worker,多处理确实会大大提高性能。
我是 运行 spyder 在 windows 机器上,我会将代码传递给另一台机器上的其他人,因此重新编译 python 和任何低级调整都不适用.
在 matlab 中,卷积充分利用了多核 t运行,并且有 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))
在每个任务中,我有大约 500 张图像作为第一步进行卷积,ndimage.filters 下的过滤器似乎只使用 1 个核心。我用 multiprocessing.queue 试过 multiprocessing.pool 和 multiprocessing.process。两者都有效,但 运行 比使用单一进程慢得多。原因很可能是 pickle 和开销:如果我在每个 worker 中生成假数据而不是将真实数据传递给每个 worker,多处理确实会大大提高性能。
我是 运行 spyder 在 windows 机器上,我会将代码传递给另一台机器上的其他人,因此重新编译 python 和任何低级调整都不适用.
在 matlab 中,卷积充分利用了多核 t运行,并且有 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))