如何解决转换嵌套循环Python代码以使用多处理池
我有一些具有以下结构的代码:带有嵌套参数范围的函数。对于MVCE,只需考虑以下内容
def func(x,y):
return x*x,x+(5*y)
results = []
for a in range(3):
for b in range(2,5):
temp_results = func(a,b)
results.append(temp_results)
sorted_results = sorted(results,key=lambda x: x[1],reverse=True)
print(sorted_results)
我正在尝试使用多处理池来运行func(a,b)部分。我想尽可能保留以上结构。
这是我到目前为止基于多处理池示例看到的内容。映射参数不起作用,因为它们期望在那里存在块大小。另外,如何在列表中收集池结果,以便以后进行排序?有没有一种方法与上述单线程情况非常相似?
a_params = []
b_params = []
for a in range(3):
for b in range(2,5):
a_params.append(a)
b_params.append(b)
from multiprocessing import Pool
def pool_handler():
p = Pool(2)
p.map(func,a_params,b_params)
if __name__ == '__main__':
pool_handler()
解决方法
map
用于具有单个参数的函数。如果要传递多个参数,请使用starmap
(或重写func
以获取一个元组并将参数元组传递给map
)。
您无需执行任何其他操作即可将结果放入列表中。 map/starmap
自动将结果累积到列表中。
因此,总的来说,这可行:
import multiprocessing as mp
def func(x,y):
print(x*x,x+(5*y))
return x*x,x+(5*y)
def main():
with mp.Pool(2) as pool:
results = pool.starmap(func,[(a,b) for a in range(3)
for b in range(2,5)])
sorted_results = sorted(results,key=lambda x: x[1],reverse=True)
print(sorted_results)
if __name__ == '__main__':
main()
并显示:
0 10
0 15
0 20
1 11
1 16
1 21
4 12
4 17
4 22
[(4,22),(1,21),(0,20),(4,17),16),15),12),11),10)]
,
您只需要保存结果并最终订购。
import multiprocessing as mp
def func(vals):
x,y = vals
return x*x,x+(5*y)
def main():
input_data = []
for a in range(3):
for b in range(2,5):
input_data.append([a,b])
n_threads = 4
pool = mp.Pool
with pool(n_threads) as p:
results = p.map(func,input_data)
sorted_results = sorted(results,reverse=True)
print(sorted_results)
if __name__ == '__main__':
main()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。