Python多处理具有多个输入的函数

时间:2010-12-16 16:53:47

标签: python multiprocessing

在Python中,multiprocessing模块可用于并行运行一系列值的函数。例如,这会生成f。

的前100000个评估的列表
def f(i):
    return i * i

def main():
    import multiprocessing
    pool = multiprocessing.Pool(2)
    ans = pool.map(f, range(100000))

    return ans

当f接受多个输入但只有一个变量变化时,可以做类似的事情吗?例如,您将如何并行化:

def f(i, n):
    return i * i + 2*n

def main():
    ans = []
    for i in range(100000):
        ans.append(f(i, 20))

    return ans

5 个答案:

答案 0 :(得分:28)

您可以使用functools.partial

def f(i, n):
    return i * i + 2*n

def main():
    import multiprocessing
    pool = multiprocessing.Pool(2)
    ans = pool.map(functools.partial(f, n=20), range(100000))

    return ans

答案 1 :(得分:15)

有几种方法可以做到这一点。在问题中给出的示例中,您可以定义包装函数

def g(i):
    return f(i, 20)

并将此包装传递给map()。更通用的方法是使用一个包含单个元组参数的包装器并将元组解包为多个参数

def g(tup):
    return f(*tup)

或使用等效的lambda表达式:lambda tup: f(*tup)

答案 2 :(得分:5)

如果你使用名为multiprocessing的{​​{1}}分叉,你可以获得带有多个参数的池......并且还可以使用pathos函数。关于它的好处是你不必改变你的编程结构以适应并行工作。

lambda

答案 3 :(得分:0)

这种技术被称为Currying:https://en.wikipedia.org/wiki/Currying

使用functools.partial内部的经典map命令而不使用pool.map的另一种方法:

def f(args):
   x, fixed = args
   # FUNCTIONALITY HERE

pool = multiprocessing.Pool(multiprocessing.cpu_count() - 1)
pool.map(f, map(lambda x: (x, fixed), arguments))

答案 4 :(得分:-3)

你可以使用穷人的蜷缩(也称为包裹):

new_f = lambda x: f(x, 20)

然后拨打new_f(i)

相关问题