Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何并行化接受多个常量的函数?_Python_Python 3.x_Multiprocessing - Fatal编程技术网

Python 如何并行化接受多个常量的函数?

Python 如何并行化接受多个常量的函数?,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我正在尝试并行化一个接受多个常量参数的函数。到目前为止,我已经能够运行它,但它并没有并行化进程。我应该怎么做 我试着做到以下几点: 将numpy导入为np 导入多处理 def optm(hstep、astep、time_ERA): #这是从数据集中获取数组的第二个函数 数据=检查日期(时间,2,4) zlevels=数据[0] pottemp=数据[1] 对于np.linspace中的z1(0,zlevels[-1],hstep): 对于np.linspace中的z2(0,zlevels[-1]

我正在尝试并行化一个接受多个常量参数的函数。到目前为止,我已经能够运行它,但它并没有并行化进程。我应该怎么做

我试着做到以下几点:

将numpy导入为np
导入多处理
def optm(hstep、astep、time_ERA):
#这是从数据集中获取数组的第二个函数
数据=检查日期(时间,2,4)
zlevels=数据[0]
pottemp=数据[1]
对于np.linspace中的z1(0,zlevels[-1],hstep):
对于np.linspace中的z2(0,zlevels[-1],hstep):
对于np.linspace中的a1(0,0.01,astep):#最大角度
对于np.linspace中的a2(0,0.01,astep):
对于np.linspace(0,0.01,astep)中的a3:
result_array=另一个_函数(zlevels,pottemp,z1,z2,a1,a2,a3)#这个函数完成了代码中的所有数学运算。因此,计算它需要很多时间。
返回结果\u数组
然后我以这种方式并行化了函数:

input_list=[(hstep,astep,time_ERA)]#为必要的startmap创建一个元组
池=多处理。池()
结果=pool.starmap(optm,输入列表)
pool.close()

当我运行它时,它比没有并行化需要更长的时间。这是我第一次尝试并行化代码,所以我仍然不确定是否应该使用map或starmap以及如何并行化它。

使用我的评论中针对您的问题的最小示例:

import multiprocessing
import time
import numpy as np

def optm(hstep,astep,time_ERA):
    values = []
    #this is a secondary function where I get arrays from a dataset
    data = checkdate(time_ERA,2,4)
    zlevels=data[0] 
    pottemp=data[1] 
    for z1 in np.linspace(0,zlevels[-1],hstep):
        for z2 in np.linspace(0,zlevels[-1],hstep):
            for a1 in np.linspace(0,0.01,astep): # max angle
                for a2 in np.linspace(0,0.01,astep):
                    for a3 in np.linspace(0,0.01,astep):
                        values.append([zlevels,pottemp,z1,z2,a1,a2,a3])
    return values

def mp_worker((zlevels,pottempt,z1,z2,a1,a2,a3)):
    temp = another_function(zlevels,pottemp,z1,z2,a1,a2,a3)
    # do something with the result

def mp_handler(data):
    p = multiprocessing.Pool(2) # Change 2 to your cpu count
    p.map(mp_worker, data)

if __name__ == '__main__':
    data = optm(hstep,astep,time_ERA) 
    mp_handler(data)

您可以对每组参数执行
pool.apply_async()
,或者使用多处理队列将作业提供给子流程,而不是映射。我假设,输出需要存储在一个数组中,因此队列将使这变得更容易。您可以将作业馈送到一个队列并将结果推送到另一个队列,当所有进程完成时,从主线程中的结果队列收集结果并将其存储到一个数组。

使用我针对您的问题的评论中的最小示例:

import multiprocessing
import time
import numpy as np

def optm(hstep,astep,time_ERA):
    values = []
    #this is a secondary function where I get arrays from a dataset
    data = checkdate(time_ERA,2,4)
    zlevels=data[0] 
    pottemp=data[1] 
    for z1 in np.linspace(0,zlevels[-1],hstep):
        for z2 in np.linspace(0,zlevels[-1],hstep):
            for a1 in np.linspace(0,0.01,astep): # max angle
                for a2 in np.linspace(0,0.01,astep):
                    for a3 in np.linspace(0,0.01,astep):
                        values.append([zlevels,pottemp,z1,z2,a1,a2,a3])
    return values

def mp_worker((zlevels,pottempt,z1,z2,a1,a2,a3)):
    temp = another_function(zlevels,pottemp,z1,z2,a1,a2,a3)
    # do something with the result

def mp_handler(data):
    p = multiprocessing.Pool(2) # Change 2 to your cpu count
    p.map(mp_worker, data)

if __name__ == '__main__':
    data = optm(hstep,astep,time_ERA) 
    mp_handler(data)

您可以对每组参数执行
pool.apply_async()
,或者使用多处理队列将作业提供给子流程,而不是映射。我假设,输出需要存储在一个数组中,因此队列将使这变得更容易。您可以将作业馈送到一个队列并将结果推送到另一个队列,当所有进程完成时,从主线程中的结果队列收集结果并将其存储到一个数组。

[(hstep,astep,time_ERA)]
是一个输入。无法真正并行运行一个函数调用。必须为池类指定要创建的进程数,否则将使用默认的1个进程。使用psutil检查机器中的物理进程数,给出两倍于该数量的进程来创建。您应该并行化
另一个\u函数,而不是
optm
。我将创建一个多处理队列,并将作业附加到队列中,而不是函数调用。然后启动
x
进程,其中
x
multiprocessing.cpu\u count
并将队列提供给每个进程。在每个进程内部,使用给定的参数调用函数。顺便说一句:在每次迭代中重写
result\u array
。注意:使用可能比多重处理至少快几个数量级。但这将取决于另一个函数的细节(可能需要修改),因此可能是一个更具侵入性的改变。这就是说,如果您想了解数字代码矢量化的性能,通常首先要查看
[(hstep,astep,time_ERA)]
是一个输入。无法真正并行运行一个函数调用。必须为池类指定要创建的进程数,否则将使用默认的1个进程。使用psutil检查机器中的物理进程数,给出两倍于该数量的进程来创建。您应该并行化
另一个\u函数,而不是
optm
。我将创建一个多处理队列,并将作业附加到队列中,而不是函数调用。然后启动
x
进程,其中
x
multiprocessing.cpu\u count
并将队列提供给每个进程。在每个进程内部,使用给定的参数调用函数。顺便说一句:在每次迭代中重写
result\u array
。注意:使用可能比多重处理至少快几个数量级。但这将取决于另一个函数的细节(可能需要修改),因此可能是一个更具侵入性的改变。这就是说,如果您想了解数字代码矢量化的性能,通常是第一个要查找的位置,我想您忘记了从mp_handlerAlso返回处理过的数据,
data.append([…])
返回此错误
AttributeError:“tuple”对象没有属性“append”
。我正在尝试修复它,一旦我发现它,我会发布它out@rusu_ro1在代码中查看我的注释。结果必须在
mp_worker
@Dschoni内部处理,这是我迄今为止得到的最接近的答案,但当我尝试附加数据时,它仍然返回相同的错误。我相信附加它会很困难,因为
zlevels
pottemp
是数组,而
z1、z2、a1、a2和a3的大小相同。这是因为我很笨。在我初始化之后,您已经自己声明了数据。我将再次编辑。我想您忘了从mp_Handleraso返回处理过的数据,
data.append([…])
返回此错误
AttributeError:“tuple”对象没有属性“append”
。我正在尝试修复它,一旦我发现它,我会发布它out@rusu_ro1在代码中查看我的注释。结果必须在
mp_worker
@Dschoni内部处理,这是我迄今为止得到的最接近的答案,但当我尝试附加数据时,它仍然返回相同的错误。我相信附加它会很困难,因为
zlevels
pottemp
是数组,而
z1,z2,