Python 用多处理填充三维阵列
我希望使用多处理从以下脚本填充data1数组。现在,脚本运行正常,但数组没有填充。我尝试实现,但由于使用了两个iterables,我无法让它工作。感激帮助;谢谢 顺便说一下,我在最新的MacOS上使用jupyter笔记本电脑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) #
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。这可能就是为什么你只能看到它运行两倍的速度。