python multiprocessing pool.map()比正常执行慢

时间:2018-07-11 16:00:59

标签: python multiprocessing

首先,我想说我是python编程的初学者。因此,我的错误很可能很明显。我最近尝试通过使用多处理来提高代码的性能。但是我还没有成功,希望你能帮助我。

我有一个需要针对数据集的每个记录执行的计算。我总共有345条记录。对于每条记录,我的计算需要大约0.0016-0.002秒,总计0.552-0.6秒。从技术上讲,我的CPU有12个内核。因此,我希望通过并行处理来加快此计算的速度,使大约0.07到0.08秒。由于计算完全独立于其他数据记录,因此我不需要任务或共享内存之间的任何形式的同步。

我选择了multiprocessing.pool函数来实现。我的代码或多或少是这样的:

 p = multiprocessing.Pool(core_num)

 for record in range(0, dataset_len):
     task_list.append((const1, const2, dataset[record, :], task_idx))

 output = p.map(calculation_func, task_list)
 p.close()

const1,const2是计算函数Calculation_func用于评估数据所需的常量。 task_idx只是一个标识符,用于在计算之后以正确的顺序携带数据。仅从

执行
output = p.map(calculation_func, task_list)

在core_num = 12的情况下执行大约需要2.2秒,而在core_num = 4的情况下,我达到的最好时间是1.6秒。这两种方法都比不使用多处理而仅调用函数要慢。

我已经尝试过的:

  • 使用星图代替地图,以替换输入列表中的元组
  • 我将数据集切成thread_num个子集,并将此子集附加到task_list,以具有相同数量的任务和core_num。

在两种情况下,我在calculation_func()的开始和结束处都添加了time.time(),并打印了所有评估中的一个或1/12所需的时间。测量的时间与一开始的预期一样短。

问题:

  • 我使用multiprocessing.pool.map()做出了不错的选择吗?
  • 如果我可以衡量出Calculation_func()仅需要预期的时间-其余输出将如何处理= p.map(calculation_func,task_list)
  • 我排除了由于const1和const2什么情况阻塞而导致不同进程尝试访问同一RAM的可能性。根据我对文档的理解,流程的初始化会将所有数据复制到新的存储单元中。这是正确的吗?

0 个答案:

没有答案
相关问题