如何使用带有* args的映射来解析python函数调用中的元组

时间:2014-02-26 20:42:06

标签: python map functional-programming multiprocessing

我目前正在对一组我要并行化的变量进行合并。我的代码看起来像这样:

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

3 个答案:

答案 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