我创建了一个比单进程慢的多进程函数
for n in range(nombre_de_cycles):
debut = time.time()
paris.reveil_multiproc(2)
duree = time.time() - debut
print((n, duree), end=",")
提供:
(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),
当monoproc:
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),
功能如下:
Class Ville:
timestamp = 0
def __init__(self, nb_de_cyclistes, Prestataire):
self.timestamp =0
def reveil(self):
self.timestamp += 1
list(map(lambda cycliste :cycliste.avancer(self.timestamp), self.cyclistes))
def faire_avancer(cycliste):
cycliste.avancer(Ville.timestamp)
def reveil_multiproc(self, n_jobs=1):
import multiprocessing
self.timestamp += 1
Ville.timestamp = self.timestamp
pool = multiprocessing.Pool(n_jobs)
pool.map(Ville.faire_avancer, self.cyclistes)
我做错了什么?你知道吗
多处理不是一个一刀切的解决方案。您的解决方案只需做很少的工作,就会产生大量的开销。你知道吗
您的开销包括:创建2个工作进程,将
self.cylistes
拆分成块,用pickle
序列化,并使用IPC将其发送到子进程。所有这些都只是简单地调用cycliste.avancer()
,它似乎只做很少的工作。你知道吗当我们看不到您在
avancer()
中做了多少工作时,拥有一个数十万个项目的大列表是微不足道的,毫无意义。这里的项目越多,实际上很可能会减慢多处理方法的速度,因为不太可能对pickle
性能进行优化。你知道吗在进行过早的优化之前,您需要学习如何使用Python的分析工具(例如:cProfile、line\u profiler)。你知道吗
当您有长时间运行的CPU密集型任务,而这些任务的大部分时间都不在等待IO时,请使用
multiprocessing
。如果每次对avancer()
的调用都需要30秒才能运行,那么使用multiprocessing
时的性能会比不使用multiprocessing
时好得多。你知道吗相关问题 更多 >
编程相关推荐