gpt4 book ai didi

python - map() 和 pool.map() 的区别

转载 作者:太空宇宙 更新时间:2023-11-03 13:44:39 25 4
gpt4 key购买 nike

我有这样的代码

def plotFrame(n):
a = data[n, :]
do_something_with(a)

data = loadtxt(filename)
ids = data[:,0] # some numbers from the first column of data
map(plotFrame, ids)

这对我来说效果很好。现在我想尝试用 pool.map() 替换 map() 如下:

pools = multiprocessing.Pool(processes=1)
pools.map(plotFrame, ids)

但这行不通,说:

NameError: global name 'data' is not defined

问题是:发生了什么事?为什么 map() 不会提示未传递给函数的 data 变量,但 pool.map() 会提示?

编辑:我正在使用 Linux。

编辑 2:根据@Bill 的第二个建议,我现在有以下代码:

def plotFrame_v2(line):
plot_with(line)

if __name__ == "__main__":
ff = np.loadtxt(filename)
m = int( max(ff[:,-1]) ) # max id
l = ff.shape[0]
nfig = 0
pool = Pool(processes=1)
for i in range(0, l/m, 50):
data = ff[i*m:(i+1)*m, :] # data of one frame contains several ids
pool.map(plotFrame_v2, data)
nfig += 1
plt.savefig("figs_bot/%.3d.png"%nfig)
plt.clf()

正如预期的那样工作。但是,现在我遇到了另一个意外问题:生成的图形是空白的,而上面使用 map() 的代码生成的图形内容为 data.

最佳答案

使用 multiprocessing.pool,您可以生成单独的进程来使用共享(全局)资源 data。通常,您可以允许进程使用父进程中的共享资源,方法是将该资源显式设置为 global。但是,更好的做法是将所有需要的资源作为函数参数显式传递给子进程。如果您在 Windows 上工作,这是必需的。查看multiprocessing guidelines here .

所以你可以尝试做

data = loadtxt(filename)

def plotFrame(n):
global data
a = data[n, :]
do_something_with(a)

ids = data[:,0] # some numbers from the first column of data
pools = multiprocessing.Pool(processes=1)
pools.map(plotFrame, ids)

或更好地查看 this thread关于使用 multiprocessing.pool 向函数提供多个参数。一个简单的方法可能是

def plotFrameWrapper(args):
return plotFrame(*args)

def plotFrame(n, data):
a = data[n, :]
do_something_with(a)

if __name__ == "__main__":
from multiprocessing import Pool
data = loadtxt(filename)
pools = Pool(1)

ids = data[:,0]
pools.map(plotFrameWrapper, zip([data]*len(inds), inds))
print results

最后一件事:因为看起来您在示例中所做的唯一一件事就是对数组进行切片,您可以先简单地切片,然后将切片的数组传递给您的函数:

def plotFrame(sliced_data):
do_something_with(sliced_data)

if __name__ == "__main__":
from multiprocessing import Pool
data = loadtxt(filename)
pools = Pool(1)

ids = data[:,0]
pools.map(plotFrame, data[ids])
print results

关于python - map() 和 pool.map() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22662841/

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