gpt4 book ai didi

python - 使用 python 进行多处理比顺序处理慢

转载 作者:太空宇宙 更新时间:2023-11-03 17:52:18 25 4
gpt4 key购买 nike

我投入了大量时间重写代码以利用更多核心,但是当我对其进行基准测试时,我发现我所取得的成绩只是使其比原始代码慢 7 倍,尽管在 16 个核心上运行比一!这让我相信我一定做错了什么。

该代码有 4000 多行,并且需要大量相当繁重的输入文件,因此我无法发布重现该问题的内容。不过,我可以说我调用的函数通常需要 0.1 秒才能运行,并使用 ctypes 调用一些 c 库。它还在内存中传递了相当数量的数据 - 也许是 1 MB?一些看起来有点慢的伪代码:

    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 秒),因此我不认为与多处理相关的开销会减慢它的速度。任何帮助将不胜感激!

最佳答案

这个

 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()

可以而且应该改成这样

 pool=mp.Pool(processes=NoCPUs)

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]
result = pool.map(AnalyseSection,Args)

pool.join()

这更符合您想要实现的目标。您有一个多处理池,您可以在其中输入数据并等待结果。您不必在每次迭代中启动/停止池。

请记住,启动处理会产生相关成本(如果您习惯使用线程,则该成本比线程大得多)。

关于python - 使用 python 进行多处理比顺序处理慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28961590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com