linux双核对线程,python多处理与线程对于Windows和Linux上的cpu绑定工作

因此,我编写了一些测试代码,以了解与线程相比,多处理模块将如何在CPU绑定的工作上进行扩展。在Linux上,我得到了预期的性能提高:

linux (dual quad core xeon):

serialrun took 1192.319 ms

parallelrun took 346.727 ms

threadedrun took 2108.172 ms

我的双核MacBook Pro显示了相同的行为:

osx (dual core macbook pro)

serialrun took 2026.995 ms

parallelrun took 1288.723 ms

threadedrun took 5314.822 ms

然后我在一台Windows机器上进行了尝试,得到了一些非常不同的结果。

windows (i7 920):

serialrun took 1043.000 ms

parallelrun took 3237.000 ms

threadedrun took 2343.000 ms

为什么,为什么,多处理方法在Windows上会慢得多?

测试代码如下:

#!/usr/bin/env python

import multiprocessing

import threading

import time

def print_timing(func):

def wrapper(*arg):

t1 = time.time()

res = func(*arg)

t2 = time.time()

print '%s took %0.3f ms' % (func.func_name, (t2-t1)*1000.0)

return res

return wrapper

def counter():

for i in xrange(1000000):

pass

@print_timing

def serialrun(x):

for i in xrange(x):

counter()

@print_timing

def parallelrun(x):

proclist = []

for i in xrange(x):

p = multiprocessing.Process(target=counter)

proclist.append(p)

p.start()

for i in proclist:

i.join()

@print_timing

def threadedrun(x):

threadlist = []

for i in xrange(x):

t = threading.Thread(target=counter)

threadlist.append(t)

t.start()

for i in threadlist:

i.join()

def main():

serialrun(50)

parallelrun(50)

threadedrun(50)

if __name__ == '__main__':

main()

我在运行win2k3的四核Dell PowerEdge 840上运行了测试代码,结果没有你的那么引人注目,但你的观点仍然有效:serialrun用了1266000毫秒,parallelrun用了1906000毫秒,threaderun用了4359000毫秒,我有兴趣看看你得到了什么答案。我不认识自己。

用于多处理的python文档将Windows中的问题归咎于缺少os.fork()。在这里可能适用。

看看当你导入psyco时会发生什么。首先,安装简单:

C:\Users\hughdbrown>\Python26\scripts\easy_install.exe psyco

Searching for psyco

Best match: psyco 1.6

Adding psyco 1.6 to easy-install.pth file

Using c:\python26\lib\site-packages

Processing dependencies for psyco

Finished processing dependencies for psyco

将其添加到python脚本的顶部:

import psyco

psyco.full()

我得到这些结果时没有:

serialrun took 1191.000 ms

parallelrun took 3738.000 ms

threadedrun took 2728.000 ms

我通过以下方式获得这些结果:

serialrun took 43.000 ms

parallelrun took 3650.000 ms

threadedrun took 265.000 ms

平行线仍然很慢,但其他的线会燃烧橡胶。

编辑:同样,尝试使用多处理池。(这是我第一次尝试这个,速度太快了,我想我一定错过了什么。)

@print_timing

def parallelpoolrun(reps):

pool = multiprocessing.Pool(processes=4)

result = pool.apply_async(counter, (reps,))

结果:

C:\Users\hughdbrown\Documents\python\StackOverflow>python  1289813.py

serialrun took 57.000 ms

parallelrun took 3716.000 ms

parallelpoolrun took 128.000 ms

threadedrun took 58.000 ms

+1进行优化。

非常整洁!降低迭代次数(进程),同时将计数提高到值,这表明,正如拜伦所说,Parralell的缓慢性来自于Windows进程增加的安装时间。

池似乎没有等待自己完成,有一个join()方法用于池,但它似乎没有做我认为应该做的:p。

是的,我担心我弄错了。

在UNIX变体下,进程更轻。Windows进程很重,启动要花很多时间。线程是在Windows上执行多处理的推荐方法。

哦,有趣的是,这是否意味着对测试平衡的更改,比如说计数更高但次数更少,会让Windows重新获得一些多处理性能?我去试试。

尝试重新校准计数到10000.000和8次迭代,结果更偏向于Windows:

serialrun took 1651.000 ms parallelrun took 696.000 ms threadedrun took 3665.000 ms

有人说,在Windows上创建进程比在Linux上更昂贵。如果你在网站上搜索,你会发现一些信息。这是我很容易找到的。

刚开始游泳池需要很长时间。我在"现实世界"程序中发现,如果我可以打开一个池,并将其用于许多不同的进程,通过方法调用(通常使用map.async)传递引用,那么在Linux上我可以节省几个百分点,但在Windows上,我通常可以将花费的时间减半。对于我的特定问题,Linux总是更快,但即使在Windows上,我也能从多处理中获得好处。

当前,counter()函数没有修改太多的状态。尝试更改counter(),以便它修改许多内存页。然后运行一个CPU绑定的循环。看看Linux和Windows之间是否还有很大的差异。

我现在没有运行python 2.6,所以我不能自己尝试它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值