我创建了一个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),
我做错了什么?
答案 0 :(得分:1)
多重处理不是“一刀切”的解决方案。您的解决方案要做很少的工作会产生大量开销。
您的开销是:创建2个工作进程,将self.cylistes
拆分为多个块,使用pickle
对其进行序列化,然后使用IPC将其发送到子进程。只需调用cycliste.avancer()
即可完成所有这些工作,看来工作量很小。
拥有成百上千个项目的庞大清单是微不足道的,当我们看不到您在avancer()
中正在从事多少工作时,它毫无意义。实际上,您拥有的更多项目很可能会减慢多处理方法的速度,因为您不太可能实现pickle
性能的优化。
在进行过早的优化之前,您需要学习如何使用Python的分析工具(例如:cProfile,line_profiler)。
当您有长时间运行且占用大量CPU的任务而又没有花费大量时间等待IO时,请使用multiprocessing
。如果每次对avancer()
的调用都花了30秒钟,那么使用multiprocessing
会比不使用它时获得更好的性能。