Python:使用multiprocessing.pool时解压缩函数并追加到列表

时间:2019-02-07 14:05:57

标签: python parallel-processing multiprocessing python-multiprocessing unpack

我有一个函数(preprocess_fit),它将首先对数据集进行预处理(即平滑,基线校正和滤除不良数据)。然后,该函数对参数进行初始猜测,然后在猜测中进行迭代以找到优化的拟合,然后返回const1,const2。该函数还计算了一堆其他参数,但是在这种情况下不会返回它们。

然后我需要在目录中的所有文件(〜1000个文件)上循环使用此功能。我通过使用包含for循环的第二个函数(函数)来完成此操作。预处理步骤(尤其是猜测迭代)特别耗时。

我想使用多处理模块来合并功能(函数)并解压缩常量,然后附加到列表中。该try:except:被包括在内,因为某些文件缺少元数据并且preprocess_fit函数失败,并且我希望在出现这种情况时将nan值附加到列表中。

问题: 1)池无法打开功能 2)如果仅从函数(文件)返回const1,则进程将附加到列表中,而不是输出中。

任何建议都会很棒。

def preprocess_fit(file):
    #applies a number of pre-processing steps based on file metadata
    #optimizes fit starting with an initial guess for a parameter until RMS 
    #is minimized
    #returns constants from fitting process and final “guess” parameter
    return const1, const2

def function(files):
    for file in files:
        const1, const2 = preprocess_fit(file)
    return const1, const2

if __name__ == '__main__':
    files = glob.glob("largedata\*.txt")
    p = Pool(24)
    c1 = []
    c2 = []
    import numpy as np
    try:
        const1, const2 = p.map(function, files)
        c1.append(const1)
        c2.append(const2)
    except:
        c1.append(np.nan)
        c2.append(np.nan)
    p.close()
    p.join()

1 个答案:

答案 0 :(得分:0)

当函数返回多个项目时,您将从pool.map()调用中获得结果元组列表。 const1将需要这些元组中的所有第一项,const2将需要这些元组中的所有第二项。这是zip内置函数的工作,该函数返回一个迭代器,该迭代器聚合作为参数传递的每个可迭代对象中的元素。

您必须解压缩列表,以便结果元组是zip函数的参数。然后通过分配多个变量来解压缩迭代器:

const1, const2 = zip(*pool.map(function, files))