多重处理具有多个输入的函数
在 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
In Python the multiprocessing
module can be used to run a function over a range of values in parallel. For example, this produces a list of the first 100000 evaluations of f.
def f(i):
return i * i
def main():
import multiprocessing
pool = multiprocessing.Pool(2)
ans = pool.map(f, range(100000))
return ans
Can a similar thing be done when f takes multiple inputs but only one variable is varied? For example, how would you parallelize this:
def f(i, n):
return i * i + 2*n
def main():
ans = []
for i in range(100000):
ans.append(f(i, 20))
return ans
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以使用
functools.partial()
You can use
functools.partial()
有几种方法可以做到这一点。在问题中给出的示例中,您可以定义一个包装函数
并将该包装函数传递给
map()
。更通用的方法是使用一个包装器,它接受单个元组参数并将元组解包为多个参数,或者使用等效的 lambda 表达式:
lambda tup: f(*tup)
。There are several ways to do this. In the example given in the question, you could just define a wrapper function
and pass this wrapper to
map()
. A more general approach is to have a wrapper that takes a single tuple argument and unpacks the tuple to multiple argumentsor use a equivalent lambda expression:
lambda tup: f(*tup)
.如果您使用我的
multiprocessing
分支(称为pathos
),您可以获得采用多个参数的池……并且还采用lambda
函数。它的好处是您不必改变编程结构来适应并行工作。If you use my fork of
multiprocessing
, calledpathos
, you can get pools that take multiple arguments… and also takelambda
functions. The nice thing about it is that you don't have to alter your programming constructs to fit working in parallel.这种技术被称为柯里化:https://en.wikipedia.org/wiki/Currying
另一种不使用 functools.partial 的方法是使用 pool.map 中的经典 map 命令:
This technique is know as Currying: https://en.wikipedia.org/wiki/Currying
Another way to do it without using
functools.partial
using the classicalmap
command insidepool.map
:您可以使用穷人柯里化(也称为包装它):
然后调用
new_f(i)
。You can use poor man's currying (aka wrap it):
then call
new_f(i)
.