我花了很多时间重写代码来开发更多的内核,但是当我对它进行基准测试时,我发现我所做的只是使它比原始代码慢7倍,尽管它运行在16个内核上,而不是一个!这使我相信我一定做错了什么。在
代码有4000多行,需要大量的输入文件,所以我不能发布一些重现问题的内容。但是,我可以说,我调用的函数通常需要0.1s才能运行,并使用ctypes调用一些c库。它还会在内存中传递相当数量的数据—可能是1MB?一些看起来像慢比特的伪代码:
def AnalyseSection(Args):
Sectionsi,SectionNo,ElLoads,ElLoadsM,Materials,CycleCount,FlapF,EdgeF,Scaling,Time,FlapFreq,EdgeFreq=Args
for i in range(len(Sections[Elements])):
#Do some heavy lifting with ctypes
return Result
for i in range(10):
for j in range(10):
for k in range(10):
Args=[(Sections[i],SectionList[i],ElLoads,ElLoadsM,Materials,CycleCount,FlapF,EdgeF,Scaling,Time,FlapFreq,EdgeFreq) for n in SectionList]
pool=mp.Pool(processes=NoCPUs,maxtasksperchild=1)
result = pool.map(AnalyseSection,Args)
pool.close()
pool.join()
我希望有人能发现一个明显的错误,导致它运行得慢得多?该函数需要一段时间才能运行(每次调用通常为0.1秒),因此我认为与多处理相关的开销不会使它如此慢下来。任何帮助都将不胜感激!在
这个
可以而且应该转变成这样
^{pr2}$这更符合你正在努力实现的目标。您有一个多处理池,您可以在其中输入数据并等待结果。您不必在每次迭代中启动/停止池。在
请记住,启动已处理的进程是有成本的(如果您习惯于线程,则要比线程大得多)。在
相关问题 更多 >
编程相关推荐