让我们考虑一个带有一个参数的函数f来映射(变化)和几个修复参数:
f(var, param1, param2, param3, param4)
param i
是固定值(如int,float,booleans,...),var
参数是对象列表。
目前的做法:
p1 = 0
p2 = 200
var = [[Object(x, p1, p2), Object(y, p1, p2), Object(z, p1, p2 = test = True)] for x in range(5) for y in range(10) for z in range(25)]
for v in var:
f(v, param1, param2, param3, param4)
由于var
的一个元素的计算不依赖于其他元素,我实际上切片列表var
并用N个不同的切片启动程序N次,因此我运行了N个程序我的电脑的N核心。
这是一种进行多处理的手动方式。但是,跟踪已完成的内容和仍有待计算的内容并不十分方便。
我想直接在程序中实现多线程/多处理。
如果没有fix参数,我发现这种方式似乎有效:
from multiprocessing import Pool
p = Pool(processes = 16) # 16 cores.
p.map(f, var)
p.terminate()
使用上面的小代码,我没有使用相同的f函数,它仅用于测试目的。如何使用我的f函数来修复参数呢?
最好的方法是什么?谢谢!
python的版本:3.6
编辑: 我还想跟踪进展情况。目前,我的代码是:
for i,v in enumerate(var):
print ("{} / {}".format(i, len(var))
f(v, param1, param2, param3, param4)
这可以通过多处理完成吗?
答案 0 :(得分:1)
如果我理解你,你的问题可以重写为:
如何使用多处理轻松映射具有多个固定参数的函数?
类似于p.starmap(f, [(v, fix1, fix2, fix3) for v in dynamics])
?
我认为你可以包装你的f
功能。
例如:
def fixed_para_wrapper(dynamic):
return f(dynamic, fix1, fix2, fix3)
然后您可以像p.map(fixed_para_wrapper, dynamics)
一样使用它。