gpt4 book ai didi

python-3.x - Python 多处理 - 如何创建并行化 for 循环的函数

转载 作者:行者123 更新时间:2023-12-03 16:37:23 28 4
gpt4 key购买 nike

如果您打开 Jupyter Notebook 并运行此命令:

import multiprocessing
def f(x):
a = 3 * x
pool = multiprocessing.Pool(processes=1)
global g
def g(j):
return a * j
return pool.map(g, range(5))
f(1)

你会得到以下错误

Process ForkPoolWorker-1:
Traceback (most recent call last):
File "/Users/me/anaconda3/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/Users/me/anaconda3/lib/python3.5/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/Users/me/anaconda3/lib/python3.5/multiprocessing/pool.py", line 108, in worker
task = get()
File "/Users/me/anaconda3/lib/python3.5/multiprocessing/queues.py", line 345, in get
return ForkingPickler.loads(res)
AttributeError: Can't get attribute 'g' on <module '__main__'>

我正在尝试了解这是错误还是功能。

我正在尝试让它工作,因为在我的真实情况下,f 基本上是一个易于并行化的 for 循环(每次迭代只更改一个参数),但每次迭代都会花费很多时间!我是在正确地解决问题还是有更简单的方法? (注意:在整个 notebook 中,f 本身将被多次调用,参数不同)

最佳答案

如果您在 f 之外定义 g,它会工作得很好。

import multiprocessing

def g(j):
return 4 * j

def f():
pool = multiprocessing.Pool(processes=1)
return pool.map(g, range(5))

f()

编辑:例如,您输入问题的可调用对象看起来像这样:

class Calculator():
def __init__(self, j):
self.j = j

def __call__(self, x):
return self.j*x

你的函数 f 变成这样:

def f(j):
calculator = Calculator(j)
pool = multiprocessing.Pool(processes=1)
return pool.map(calculator, range(5))

我在这种情况下工作得很好。希望它有所帮助。

关于python-3.x - Python 多处理 - 如何创建并行化 for 循环的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39592166/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com