распараллелить функцию, которая имеет несколько входов - PullRequest
0 голосов
/ 14 сентября 2018

Я хотел бы выполнить функцию несколько раз в разных потоках с разными входами функции.

Проблема в том, что моей функции для каждого запуска требуется больше, чем один вход, поэтому я пытаюсь сделать следующее: (функция здесь значительно упрощена)

import time 
from joblib import Parallel, delayed 

# A function that can be called to do work:
def work(arg1,arg2):
    return (arg1, arg2)

# List of arguments to pass to work():
arg_instances = [(1, 1), (1, 2), (1, 3), (1, 4)]

# Anything returned by work() can be stored:
results = Parallel(n_jobs=4, verbose=1, backend="threading")(map(delayed(work), arg_instances))

print(results)

К сожалениюэто не работает.

work () отсутствует 1 обязательный позиционный аргумент: 'arg2'

Это как-то связано с функцией карты, но я незнаю, как решить это.Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 14 сентября 2018

Вы можете использовать частичный , чтобы создать функцию, вызываемую позже.

Например:

funcs = [partial(work, arg1, arg2) for arg1, arg2 in arg_instances]
Parallel(...)(delayed(f) for f in funcs))

Partial - очень удобная и полезная встроенная функция Python, попробуйте!

В любом случае, глядя на библиотеку (joblib), которую вы используете, возможно, это исправит

Parallel(...)(delayed(work)(arg1, arg2) for arg1, arg2 in arg_instances))

На самом деле это не работает, потому что вы вызываете функцию "работа" со всем списком "arg_instances" в качестве первого позиционного параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...