Python 用多处理填充三维阵列

Python 用多处理填充三维阵列,python,arrays,numpy,parallel-processing,multiprocessing,Python,Arrays,Numpy,Parallel Processing,Multiprocessing,我希望使用多处理从以下脚本填充data1数组。现在,脚本运行正常,但数组没有填充。我尝试实现,但由于使用了两个iterables,我无法让它工作。感激帮助;谢谢 顺便说一下,我在最新的MacOS上使用jupyter笔记本电脑 import numpy as np import multiprocessing as mp from itertools import product #Generate random data: data = np.random.randn(12,20,20) #

我希望使用多处理从以下脚本填充data1数组。现在,脚本运行正常,但数组没有填充。我尝试实现,但由于使用了两个iterables,我无法让它工作。感激帮助;谢谢 顺便说一下,我在最新的MacOS上使用jupyter笔记本电脑

import numpy as np
import multiprocessing as mp
from itertools import product

#Generate random data:
data = np.random.randn(12,20,20)

#Create empty array to store the result
data1 = np.zeros((data.shape), dtype=np.float)

#Define the function
def fn(parameters):
    i   = parameters[0]
    j   = parameters[1]
    data1[:,i,j] =  data[:,i,j]

#Generate processes equal to the number of cores
pool = mp.Pool(processes=4)

# Generate values for each parameter: i.e. i and j
i = range(data.shape[1])
j = range(data.shape[2])

#generate a list of all combinations of the parameters
paramlist = list(product(i,j))

#call the function and multiprocessing
np.array(pool.map(fn,paramlist))
pool.close() 

Pool.map
所做的是使用辅助进程将函数应用于给定的数据。然后,它从函数中收集返回数据并将其传输给父函数

由于函数不返回任何内容,因此不会得到任何结果

发生的情况是,在每个worker中,
data1
的本地副本被修改。:-)

当需要修改大量数据时,
多处理
通常不是一个好的解决方案,因为在工作进程和父进程之间移动数据会产生开销


首先使用单个流程进行尝试。

产品在您的代码中起什么作用?您遇到的确切问题是什么?@mommermi“产品”来自“itertools”。问题是调用函数后,data1数组仍然未填充。对原始帖子进行了编辑以澄清这一点。谢谢啊,我明白了,谢谢。该脚本在指定返回值后运行良好,比串行实现快约两倍。我的笔记本电脑是双核的,但是有了多处理.cpu\u count(),我得到了4个答案。那么可能还有更大的提升空间吗?那么,您会推荐除多处理之外的其他解决方案吗?默认情况下,
multiprocessing
创建的进程数量与
cpu\u count
报告的数量相同。如果您有两个物理CPU的位
CPU\u count
reports 4,则可能是您的CPU有。我不确定hyprtreading到底能提高多少性能:仍然只有两个物理CPU。这可能就是为什么你只能看到它运行两倍的速度。