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

2024-09-29 17:15:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我花了很多时间重写代码来开发更多的内核,但是当我对它进行基准测试时,我发现我所做的只是使它比原始代码慢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秒),因此我认为与多处理相关的开销不会使它如此慢下来。任何帮助都将不胜感激!在


Tags: 函数代码inforargsrangectypes内核
1条回答
网友
1楼 · 发布于 2024-09-29 17:15:34

这个

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

可以而且应该转变成这样

^{pr2}$

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

请记住,启动已处理的进程是有成本的(如果您习惯于线程,则要比线程大得多)。在

相关问题 更多 >

    热门问题