【问题标题】:Pickle error when making parallel version of map function in Python using Multiprocessing使用多处理在 Python 中制作地图函数的并行版本时出现 Pickle 错误
【发布时间】:2017-10-02 00:33:18
【问题描述】:

我正在使用Python 3.6.1 关注Is there a simple process-based parallel map for python? 上的答案。我正在尝试以与使用常规 map 函数相同的方式使用它。为什么会这样?如何创建一个并行的map 函数以与lambda 一起使用?

def map_parallel(func, iterable, n_jobs=-1):
    if n_jobs == -1:
        n_jobs = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=n_jobs)
    return pool.map(func, iterable)

map_parallel(lambda x: x + 3, range(100))


PicklingError: Can't pickle <function <lambda> at 0x185284f28>: attribute lookup <lambda> on __main__ failed

【问题讨论】:

    标签: python function lambda parallel-processing pickle


    【解决方案1】:

    多处理泡菜对象在进程之间传递。 lambda 不可序列化(参见What can be pickled and unpickled?);它不能在进程之间传递。

    你需要定义一个函数,然后传递它。

    def add3(n):
        return n + 3
    
    map_parallel(add3, range(100))
    

    或者对于这种情况,您可以使用functools.partial 和operator.add:

    import functools
    import operator
    
    map_parallel(functools.partial(operator.add, 3), range(100))
    

    【讨论】:

    • 是否可以将lambda 转换为function?我很少将map 与functions 一起使用,并在转换可迭代对象时使用它
    • @O.rka,检查this answer。
    猜你喜欢
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2022-06-30
    相关资源
    最近更新 更多