gpt4 book ai didi

python - 使用Python进行多处理: How to parallelize nested loops and append results to dictionary?

转载 作者:行者123 更新时间:2023-12-01 09:16:23 24 4
gpt4 key购买 nike

我是 Python 多重处理新手,目前我不知道如何处理我手中的问题。我正在尝试实现一个具有两个循环(内循环和外循环)的函数并将结果附加到字典中。该功能以及我想要实现的目标类似于:

def func(p, a):
return p*a

p_dict = dict()
for p in all_possible_ps: #I would like to parallelize this
alist = list()

for a in all_possible_as: #And this for loop
alist.append(func(p,a))

p_dict[p] = alist

对于内部循环,我相信我可以实例化一个池,p=Pool(),然后p.map(func, all_possible_as)来获取名单。我不确定如何并行化两个循环并同时分配两个循环的进程数。

最佳答案

您可以使用两个不同的池,然后嵌套它们。在这里,我使用的是 pathos(它包括一个 multiprocessing 的分支,以及在池中传递 lambda 所需的序列化)。

如果你看一下带有两个变量的函数的 for 循环,你可以想到这种进展......

>>> doit = lambda x,y: x*y
>>> a = [0,1,2,3]
>>> b = [9,8,7,6]
>>> [[doit(i,j) for j in b] for i in a]
[[0, 0, 0, 0], [9, 8, 7, 6], [18, 16, 14, 12], [27, 24, 21, 18]]

嵌套并行:

>>> from pathos.pools import ThreadPool, ProcessPool
>>> p = ProcessPool()
>>> t = ThreadPool()
>>> foo = lambda x,y: p.map(doit, [x]*len(y), y)
>>> t.map(foo, a, [b]*4)
[[0, 0, 0, 0], [9, 8, 7, 6], [18, 16, 14, 12], [27, 24, 21, 18]]

imap 只是一个 map 迭代器。如果您愿意,可以使用 map,但下面我将使用 imap。我相信您具体寻找的功能是这样的:

>>> bar = lambda x,y: (x, p.map(doit, [x]*len(y), y)) 
>>> res = t.imap(bar, a, [b]*4)
>>> adict = {}
>>> for i,j in res:
... adict[i] = j
...
>>> adict
{0: [0, 0, 0, 0], 1: [9, 8, 7, 6], 2: [18, 16, 14, 12], 3: [27, 24, 21, 18]}

关于python - 使用Python进行多处理: How to parallelize nested loops and append results to dictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51219136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com