所以我敲了一些测试代码,看看多处理模块与线程相比如何在 cpu 绑定工作上进行扩展。在 linux 上,我得到了预期的性能提升:
linux(双四核至强): serialrun 耗时 1192.319 毫秒 并行运行耗时 346.727 毫秒 线程运行耗时 2108.172 毫秒
我的双核 macbook pro 显示相同的行为:
osx (双核 macbook pro) serialrun 耗时 2026.995 毫秒 并行运行耗时 1288.723 毫秒 线程运行耗时 5314.822 毫秒
然后我去 Windows 机器上试了一下,得到了一些非常不同的结果。
窗户(i7 920): serialrun 耗时 1043.000 毫秒 并行运行耗时 3237.000 毫秒 线程运行耗时 2343.000 毫秒
为什么哦,为什么,Windows 上的多处理方法要慢得多?
这是测试代码:
#!/usr/bin/env python
导入多处理
导入线程
进口时间
def print_timing(func):
def 包装器(*arg):
t1 = time.time()
res = func(*arg)
t2 = time.time()
print '%s 耗时 %0.3f ms' % (func.func_name, (t2-t1)*1000.0)
返回资源
返回包装
定义计数器():
对于 xrange(1000000) 中的 i:
经过
@print_timing
def 串行运行(x):
对于 xrange(x) 中的 i:
柜台()
@print_timing
定义并行运行(x):
进程列表 = []
对于 xrange(x) 中的 i:
p = multiprocessing.Process(目标=计数器)
proclist.append(p)
p.start()
对于我在 proclist 中:
我加入()
@print_timing
def 线程运行(x):
线程列表 = []
对于 xrange(x) 中的 i:
t = threading.Thread(目标=计数器)
线程列表.append(t)
t.start()
对于线程列表中的 i:
我加入()
定义主():
串行运行(50)
并行运行(50)
线程运行(50)
如果 __name__ == '__main__':
主要的()