2015-08-15 139 views
1

我有12核心和28GB内存的服务器。我正在运行两个版本的Python;一个用多处理,另一个用顺序。我希望Multiprocessing.py完成年初相比Sequential.py但多码需要相比,顺序码(25秒)Python多处理需要更多时间

Multiprocessing.py

import os,multiprocessing,time 
def cube(x): 
    print(x**3) 
    return 
if __name__ == '__main__': 
    jobs = [] 
    start = time.time() 
    for i in range(5000): 
     p = multiprocessing.Process(target=cube(i)) 
     jobs.append(p) 
     p.start() 
    end = time.time() 
    print end - start 

Sequential.py

的5倍以上(120秒)
import os,time 
def cube(x): 
    print(x**3) 
    return 
if __name__ == '__main__': 
    start = time.time() 
    for i in range(5000): 
     cube(i) 
    end = time.time() 
    print end - start 

你能帮忙吗?

+1

随着其巨大的差异,它可能并不重要,但你可能想看看['''timeit'''](https://docs.python.org/3/library/timeit.html)模块是否提供了类似的结果。也许在计时时注释掉打印功能。在多处理示例中,您正在计划安装以及执行 - 是您的意图吗? – wwii

+1

请清理你问题中的代码 - 缩进是关闭的,你在'''cube'(I)'''中混合了一个变量名。 – wwii

+7

您正在创建5000个进程来执行几次乘法操作?这不能比循环更快,开销太大。 – mzc

回答

5

问题是,相对于IPC通信开销而言,工作量太少。

立方体函数不适合多处理加速。试着像功能的东西“更有趣”,计算立方体的总和为1到n或诸如此类:

import os, multiprocessing, time 

def sum_of_cubes(n): 
    return sum(x**3 for x in range(n)) 

if __name__ == '__main__': 

    from multiprocessing.pool import ThreadPool as Pool 

    pool = Pool(25) 

    start = time.time() 
    print(pool.map(sum_of_cubes, range(1000, 100000, 1000))) 
    end = time.time() 
    print(end - start) 

的一般规则是:

  • 不要启动多个池比你的内核可以受益从
  • 不传递大量数据或返回大量数据(IPC负载过多)
  • 在相对于IPC开销的过程中做了大量工作。
0

您不应该为每次乘法启动一个过程。开始12个流程,并在流程创建时传递每个数字或分配数字。

如果您的个人资料相当确定,您会发现您在流程创建和清理过程中花费的所有时间。

ALSO:我已经测试了运行多少个进程与内核数量,最佳取决于体系结构(例如某些英特尔芯片每个内核有两个线程)和操作系统(Linux似乎比Windows更好地处理它) 。如果你在窗户上,我建议尝试过程计数0.8-2.2x核心计数。在Linux上,你可以做更多。

+0

好的,我不得不承认,Raymond的回答比较好。所有那些好东西不在那里,当我贡献我的:) –

0

想试试游泳池吗?例如,以下应该工作:

从多处理进口普尔

P =池(12)

结果= p.map(立方体,范围(5000))

+0

这应该也不会更快。 –