python多处理池.map()比正常执行慢

2024-04-25 14:38:41 发布

您现在位置:Python中文网/ 问答频道 /正文

首先我想说的是,我是python编程的初学者。所以我的错误很可能是显而易见的。最近我试图通过使用多重处理来提高代码的性能。但我还没成功,希望你能帮我。你知道吗

我有一个需要为数据集的每条记录执行的计算。我总共有345张唱片。对于每个记录,我的计算需要大约0.0016-0.002秒,总计0.552-0.6秒。从技术上讲,我的CPU有12个核心。因此,我希望通过并行性将计算速度提高到0.07到0.08秒左右。由于计算完全独立于其他数据记录,我不需要任务之间的任何同步或共享内存。你知道吗

我选择了执行多处理池功能。我的代码或多或少是这样工作的:

 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\u func计算数据所需的常量。task_idx只是一个标识符,用于在计算之后将数据按正确的顺序排列。只有执行

output = p.map(calculation_func, task_list)

在core数量=12的情况下需要大约2.2秒的执行时间,而在core数量=4的情况下我达到的最佳时间是1.6秒。两种方法都比不使用多处理调用函数慢。你知道吗

我已经试过了:

  • 使用starmap代替map来替换输入列表的元组
  • 我将数据集分为threads\u num子集,并将这些子集附加到task\u列表中,使其具有相同数量的任务和核心\u num

在这两种情况下,我都添加了一个时间。时间()在计算开始和结束时,打印所有计算的一个或1/12所需的时间。测得的时间和开始时预期的一样小。你知道吗

问题:

  • 我和你做了一个很好的选择吗多处理.pool.map()? 你知道吗
  • 如果我能度量出计算只需要预期的时间,那么剩下的output=p.map(calculation\u func,task\u list)会发生什么
  • 我排除了由于const1和const2 what cases阻塞,不同进程尝试访问同一个RAM的可能性。根据我对文档的理解,初始化过程会将所有数据复制到新的存储单元。是这样吗?你知道吗

Tags: 数据coremaptaskoutput数量记录时间