Python多处理方式变慢

时间:2019-03-16 13:59:43

标签: python multithreading

我创建了一个multiproc函数,该函数比单进程慢

GROUP_CONCAT

给予:

for n in range(nombre_de_cycles):
    debut = time.time()
    paris.reveil_multiproc(2)
    duree = time.time() - debut
    print((n, duree), end=",")

monoproc时:

(0, 13.04754900932312),(1, 11.9977388381958),(2, 12.56324291229248),(3, 12.289109945297241),(4, 12.300051927566528),(5, 12.322132110595703),(6, 12.058021783828735),(7, 13.218597173690796),(8, 11.991199016571045),(9, 12.178853034973145),

给予

   for n in range(nombre_de_cycles):
        debut = time.time()
        paris.reveil()
        duree = time.time() - debut
        print((n, duree), end=",")

以下是功能:

(0, 0.19302606582641602),(1, 0.030661821365356445),(2, 0.28160881996154785),(3, 0.04853320121765137),(4, 0.20609474182128906),(5, 0.04185295104980469),(6, 0.20528626441955566),(7, 0.040557146072387695),(8, 0.19860100746154785),(9, 0.11386394500732422),

我做错了什么?

1 个答案:

答案 0 :(得分:1)

多重处理不是“一刀切”的解决方案。您的解决方案要做很少的工作会产生大量开销。

您的开销是:创建2个工作进程,将self.cylistes拆分为多个块,使用pickle对其进行序列化,然后使用IPC将其发送到子进程。只需调用cycliste.avancer()即可完成所有这些工作,看来工作量很小。

拥有成百上千个项目的庞大清单是微不足道的,当我们看不到您在avancer()中正在从事多少工作时,它毫无意义。实际上,您拥有的更多项目很可能会减慢多处理方法的速度,因为您不太可能实现pickle性能的优化。

在进行过早的优化之前,您需要学习如何使用Python的分析工具(例如:cProfile,line_profiler)。

当您有长时间运行且占用大量CPU的任务而又没有花费大量时间等待IO时,请使用multiprocessing。如果每次对avancer()的调用都花了30秒钟,那么使用multiprocessing会比不使用它时获得更好的性能。