Я относительно новичок в python и пытаюсь распараллелить цикл for.Пример кода выглядит следующим образом:
def generate_session(t_max=10**5):
<-----session generating code here---->
return a, b, c
n_sessions = 100
from joblib import Parallel, delayed
sessions = Parallel(n_jobs=4, backend='threading')(delayed(generate_session) for _ in range(n_sessions))
generate_session () - это функция, создающая один полный успешный сеанс среды OpenAI gym MountainCar-v0.Мне удалось распараллелить приведенный выше код, используя многопроцессорный модуль и модули concurrent.futures без ошибок.
Реализация с использованием многопроцессорного модуля,
import multiprocessing as mp
n_sessions = 100
pool = mp.Pool(processes = 4)
sessions = [pool.apply(generate_session) for _ in range(n_sessions)]
С использованием модуля concurrent.futures,
import concurrent.futures
n_sessions = 100
with concurrent.futures.ThreadPoolExecutor(max_workers = 6) as executor:
sessions = [executor.submit(generate_session) for _ in range(n_sessions)]
sessions_result = [sessions[i].result() for i in range(len(sessions))]
Поскольку я не добился большого улучшения во времени, затраченном на обареализации, я изучал возможность использования других модулей, таких как модуль joblib.Когда я запускаю код для модуля joblib тем же способом, что и в других реализациях, я получаю сообщение об ошибке: «TypeError: объект« функция »не повторяется».Что мне здесь не хватает?
Функция generate_session () не нуждается в передаче аргументов, что затрудняет мне использование метода map, как во многих примерах, приведенных для joblib.
Какой из методов распараллеливания обеспечивает лучшую производительность в этом сценарии?