Я пытаюсь распараллелить кусок кода, используя библиотеку multiprocessing
, наброски которой следующие:
import multiprocessing as mp
import time
def stats(a,b,c,d,queue):
t = time.time()
x = stuff
print(f'runs in {time.time() -t} seconds')
queue.put(x)
def stats_wrapper(a,b,c,d):
q = mp.Queue()
# b here is a dictionary
processes = [mp.Process(target = stats,args = (a,{b1:b[b1]},c,d,q) for b1 in b]
for p in processes:
p.start()
results = []
for p in processes:
results.append(q.get())
return(results)
Идея состоит в том, чтобы распараллелить вычисления в stuff
, создав столько же процессов, сколько есть пар ключ: значение в b
, что может go до 50. Я получаю ускорение всего на 20% по сравнению с последовательной реализацией.
Я попытался переписать функцию stats_wrapper
с помощью mp.Pool
, но не смог заставить функцию apply.async
работать с другими args
, как я создал в stats_wrapper
выше.
Вопросы: -
- Как улучшить функцию
stats_wrapper
, чтобы еще больше сократить время выполнения? Есть ли способ переписать stats_wrapper
с использованием функции mp.Pool
, которая может принимать другое значение для параметра b
в функции stats
для разных процессов? Примерно так:
def pool_stats_wrapper(a,b,c,d):
q = mp.Queue
pool = mp.Pool()
pool.apply_async(stats,((a,{b1:b[b1},c,d) for b1 in b)) # Haven't figured this part yet
pool.close()
results = []
for _ in len(b):
results.append(q.get())
return (results)
Я запускаю код на 8-ядерном компьютере с 16 ГБ, если это поможет. Я пробовал вещи, упомянутые в этой ветке, но это не сильно помогло