Как распаковать результаты из `Pool.map ()`? - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть функция (preprocess_fit), которая сначала предварительно обрабатывает набор данных (то есть сглаживание, исправление базовой линии и отфильтровывает неверные данные).Затем функция принимает начальное предположение для параметра, а затем перебирает догадки, чтобы найти оптимизированное соответствие, а затем возвращает const1, const2.Функция также вычисляет кучу других параметров, но они не возвращаются в этом случае.

Затем мне нужно зациклить эту функцию для всех файлов в каталоге (~ 1000 файлов).Я делаю это, используя вторую функцию (функцию), которая содержит цикл for.Этап предварительной обработки, в частности итерация предположения, особенно трудоемкий.

Я бы хотел объединить функцию (функцию) с помощью модуля многопроцессорной обработки, распаковать константы и затем добавить в список.Включает try: exception:, поскольку в некоторых файлах отсутствуют метаданные, а функция 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 голосов
/ 07 февраля 2019

Когда ваша функция возвращает несколько элементов, вы получите список кортежей результатов из вашего вызова pool.map().const1 потребуются все первые элементы в этих кортежах, const2 все вторые элементы в этих кортежах.Это работа для встроенной функции zip , которая возвращает итератор, который агрегирует элементы из каждой итерации, передаваемой в качестве аргументов.

Вы должны распаковать список, чтобы кортежи-результатыаргументы для функции zip.Затем распакуйте итератор, назначив несколько переменных:

const1, const2 = zip(*pool.map(function, files))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...