我希望在本地多个处理器上运行我的程序中的瓶颈。我研究过multiprocessing
,但就我的目的而言,它看起来有点复杂,我想知道是否有更简单的方法。
我有一个360个角度的循环,每个角度的计算都是独立的,所以它是以什么顺序完成的并不重要。我有8个核心,所以我希望我可以简单地将该循环分成8个45个角的块,然后将这些块发送到不同的核心,并在结束时收集结果。简化后的示例如下所示:
dx = np.zeros(npixels)
for angle in range(360):
dx += calculate_gradient_for_angle(angle, x, y, z, **kwargs)
在这里,只有angle
参数是可变的。其余的都是静态的。
我研究过multiprocessing.pool.Pool.map
,但我只能找到显示传递给它的单参数函数的示例。如你所见,我的函数接受多个参数。如有任何建议,我们将不胜感激。
我在macOS 10.14.6上使用Python3.7.8
发布于 2021-08-27 11:46:21
简单的解决方案是使用functools.partial
将函数转换为单参数函数,并将其传递给multiprocessing.pool.Pool.map
,如下所示:
from functools import partial
import multiprocessing as mp
calculate_grad_partial = partial(calculate_grad_for_angle, x=x, y=y, z=z)
with mp.Pool(processes=8) as pool:
dx = pool.map(calculate_grad_partial, range(360))
发布于 2021-03-24 04:40:23
你可以构建像这样的东西。我是从this question得到这个想法的。
import concurrent.futures
def foo(bar):
return bar
# Start each calculation in a seperate thread
with concurrent.futures.ThreadPoolExecutor() as ex:
f = [ex.submit(foo, angle) for angle in range(10)]
dx = 0
# Collect all results
for r in f:
dx += r.result()
print(dx)
https://stackoverflow.com/questions/66770430
复制相似问题