Я пытаюсь построить многопроцессорность в python, чтобы уменьшить скорость вычислений, но, похоже, после многопроцессорной обработки общая скорость вычислений значительно снизилась. Я создал 4 разных процесса и разделил dataFrame на 4 разных кадра данных, которые будут вкладом в каждый процесс. После выбора времени каждого процесса кажется, что накладные расходы являются значительными, и было интересно, есть ли способ уменьшить эти накладные расходы.Как сократить время многопроцессорности в python
Я использую windows7, python 3.5, и моя машина имеет 8 ядер.
def doSomething(args, dataPassed,):
processing data, and calculating outputs
def parallelize_dataframe(df, nestedApply):
df_split = np.array_split(df, 4)
pool = multiprocessing.Pool(4)
df = pool.map(nestedApply, df_split)
print ('finished with Simulation')
time = float((dt.datetime.now() - startTime).total_seconds())
pool.close()
pool.join()
def nestedApply(df):
func2 = partial(doSomething, args=())
res = df.apply(func2, axis=1)
res = [output Tables]
return res
if __name__ == '__main__':
data = pd.read_sql_query(query, conn)
parallelize_dataframe(data, nestedApply)
Можете ли вы перечислить, сколько длинных одиночных потоков было выполнено против многопроцессорности? – Fruitspunchsamurai
Сколько у вас процессоров/ядер (реальных, а не гиперпотоков)? Это похоже на интенсивную работу с ЦП, поэтому расщепление на большее количество ядер просто замедлит работу. Кроме того, насколько велики кадры данных и насколько дорого стоит «doSomething»? Чтобы получить фрейм данных для каждого подпроцесса, он должен быть сериализован (через рассол) и десериализован, поэтому, если кадры большие и 'doSomething' дешево, вы действительно увидите большую часть времени, потраченного на накладные расходы. –
@ Fruitspunchsamurai Потребовалось 26 минут, чтобы запустить одиночную нить, в то время как для запуска функции отображения и всего 71 минуты всего потребовалось 33 минуты. – Hojin