【问题标题】:How to let Pool.map take a lambda function如何让 Pool.map 采用 lambda 函数
【发布时间】:2011-06-17 04:18:31
【问题描述】:

我有以下功能:

def copy_file(source_file, target_dir):
    pass

现在我想使用multiprocessing 来一次执行这个函数:

p = Pool(12)
p.map(lambda x: copy_file(x,target_dir), file_list)

问题是,lambda 不能被腌制,所以这失败了。解决此问题的最简洁(pythonic)方法是什么?

【问题讨论】:

    标签: python multiprocessing pool


    【解决方案1】:

    使用函数对象:

    class Copier(object):
        def __init__(self, tgtdir):
            self.target_dir = tgtdir
        def __call__(self, src):
            copy_file(src, self.target_dir)
    

    运行你的Pool.map

    p.map(Copier(target_dir), file_list)
    

    【讨论】:

    • 谢谢,这确实是我需要的!
    • 谢谢!我真希望他们能接受 lambda 函数!
    • 如果 copy_file 在方法中是 self.copy_file 怎么办?
    【解决方案2】:

    For Python2.7+ 或者 Python3,你可以使用functools.partial:

    import functools
    copier = functools.partial(copy_file, target_dir=target_dir)
    p.map(copier, file_list)
    

    【讨论】:

    • 这个甚至看起来更干净......我稍后会决定用哪一个来回答
    • 不过,这个答案还是 +1,因为它更短(在 Python 3 中,即;)
    • 稍后登陆这里,作为更新 functools.partial 在 python 2.7 中也可以选择。
    • 这个方案更好
    • 用它来修复非同构图的并行搜索。它的运行速度比 Fred Foo 的解决方案快 15 倍
    【解决方案3】:

    问题有点老了,但如果你还在使用 Python 2,我的回答会很有用。

    诀窍是使用pathos 项目的一部分:multiprocess 多处理分支。它摆脱了原始多进程的烦人限制。

    安装:pip install multiprocess

    用法:

    >>> from multiprocess import Pool
    >>> p = Pool(4)
    >>> print p.map(lambda x: (lambda y:y**2)(x) + x, xrange(10))
    [0, 2, 6, 12, 20, 30, 42, 56, 72, 90]
    

    【讨论】:

      【解决方案4】:

      来自this 的回答,pathos 让你直接运行你的 lambda p.map(lambda x: copy_file(x,target_dir), file_list),节省所有变通办法/黑客

      【讨论】:

        猜你喜欢
        • 2021-02-22
        • 2021-12-03
        • 2019-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多