Без более детального использования пакета Multiprocessing Pool действительно сложно понять и помочь. Обратите внимание, что пакет Pool не гарантирует распараллеливание: функция _apply , например, использует только одного рабочего из пула и блокирует все ваши исполнения. Вы можете узнать больше об этом здесь и там .
Но, если вы правильно используете библиотеку, вы должны убедиться, что ваш код полностью распараллеливается: Операция ввода-вывода на диске, например, может затруднить параллелизацию и, таким образом, заставить ваш код работать только в одном процессе за раз.
Надеюсь, это помогло.
[Edit ] Поскольку вы предоставили более подробную информацию о своей проблеме, я могу дать более подробные c советы:
Во-первых, ваш код является нулевым параллельным. Вы просто вызываете одну и ту же функцию N раз. Не так должна работать многопроцессорная обработка. Вместо этого, часть, которая должна быть параллельна, - это та, которая обычно находится в циклах для , как и та, что у вас внутри block_linear ().
Итак, что я вам рекомендую:
Вы должны изменить свой код, чтобы сначала вычислить всю вашу взвешенную сумму и только после этого выполнять остальные операции. Это очень поможет с распараллеливанием. Итак, поместите эту операцию в функцию:
def weighted_sum(column,df2):
temp = pd.DataFrame(np.zeros(m))
for a in range(0,m):
result = (t1.iloc[a,column]*df2)
temp.iloc[a] = result
return temp
Итак, вы используете pool.starmap для параллельного выполнения функции для 10 имеющихся у вас фреймов данных, примерно так:
results = pool .starmap (weighted_sum, [(0, s1), (1, s2), (2, s3), ...., [9, s10]]])
ps: pool.starmap похож на pool.map , но принимает список аргументов кортежа. Вы можете получить более подробную информацию об этом здесь .
Наконец, но не в последнюю очередь, вы должны обработать свои результаты, чтобы завершить свои вычисления. Поскольку у вас будет одна weighted_sum на столбец, вы можете применить сумму по столбцам, а затем rank_sum. код, чтобы иметь преимущество в многопроцессорности. Я рекомендую вам протестировать его на подвыборке фреймов данных, чтобы убедиться, что он работает правильно, прежде чем запускать его для всех ваших данных.