我目前正在对一组我要并行化的变量进行合并。我的代码看起来像这样:
mergelist = [
('leftfile1', 'rightfile1', 'leftvarname1', 'outputname1'),
('leftfile1', 'rightfile1', 'leftvarname2', 'outputname2')
('leftfile2', 'rightfile2', 'leftvarname3', 'outputname3')
]
def merger(leftfile,rightfile,leftvarname,outvarname):
do_the_merge
for m in mergelist:
merger(*m)
通常,为了加快长循环,我会将合并列表中的for m替换为....
from multiprocessing import Pool
p = Pool(8)
p.map(merger(m), mergelist)
p.close()
但是因为我正在使用星星解包元组,所以我不清楚如何正确映射这个。我如何获得*m
?
答案 0 :(得分:4)
使用lambda
:
with Pool(8) as p:
p.map(lambda m:merger(*m), mergelist)
答案 1 :(得分:1)
最简单的解决方案IMHO是更改合并功能,或添加包装器:
def merger(leftfile,rightfile,'leftvarname','outvarname'):
do_the_merge
def merger_wrapper(wrapper_tuple):
merger(*wrapper_tuple)
p.map(merger_wrapper, mergelist)
我看到@delnan实际上也在评论中提出了这个解决方案。
为此添加一点值:)你也可以像这样包装它:
from functools import partial
def unpack_wrapper(f):
def unpack(arg):
return f(*arg)
return unpack
这可以让你简化为
p.map(unpack_wrapper(merger), mergelist)
答案 2 :(得分:1)
您可以在合并函数中解压缩元组:
def merger(args):
if len(args) != 4:
# error
leftfile,rightfile,leftvarname,outvarname = args
do_the_merge
另一个选项是在参数列表中解压缩:
def merger( (leftfile,rightfile,leftvarname,outvarname) ):
do_the_merge
编辑:解决OP问题:
def merger((l,r,v,o)):
return l+r
for m in mergelist:
print merger(m)
返回
leftfile1rightfile1
leftfile1rightfile1
leftfile2rightfile2