在Python中,multiprocessing
模块可用于并行运行一系列值的函数。例如,这会生成f。
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
答案 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)
。