我正在尝试在python(2.7)中了解multiprocessing
。我的CPU有4个核心。在下面的代码中我测试了并行Vs串行执行相同基本指令的速度。
我发现使用4个核心所花费的时间仅为0.67,只有一个核心所占用的时间,而天真地我期望~0.25。
是开销的原因吗?它从何而来? 4个过程不是独立的吗?
我还尝试了pool.map
和pool.map_async
,速度方面的结果非常相似。
from multiprocessing import Process
import time
def my_process(a):
for i in range(0,a[1]):
j=0
while j<10000:
j = j+1
print(a,j)
if __name__ == '__main__':
# arguments to pass:
a = ((0,2000),(1,2000),(2,2000),(3,2000))
# --- 1) parallel processes:
# 4 cores go up to 100% each here
t0 = time.time()
proc1 = Process(target=my_process, args=(a[0],))
proc2 = Process(target=my_process, args=(a[1],))
proc3 = Process(target=my_process, args=(a[2],))
proc4 = Process(target=my_process, args=(a[3],))
proc1.start(); proc2.start(); proc3.start(); proc4.start()
proc1.join() ; proc2.join() ; proc3.join() ; proc4.join()
dt_parallel = time.time()-t0
print("parallel : " + str(dt_parallel))
# --- 2) serial process :
# 1 core only goes up to 100%
t0 = time.time()
for k in a:
my_process(k)
dt_serial = time.time()-t0
print("serial : " + str(dt_serial))
print("t_par / t_ser = " + str(dt_parallel/dt_serial))
编辑我的电脑实际上有两个物理核心(2 =每个插槽2个核心* 1个插槽,来自lscpu
[感谢@goncalopp])。如果我只使用前两个进程运行上面的脚本,我得到的比率为0.62,与使用3或4个进程获得的比率没有差别。我想要比这更快的速度并不容易。
我在lscpu
的另一台PC上进行了测试:CPU(s):32,每个核心的线程数:2,每个插槽的核心数:8,套接字数:2,我得到了比率为0.34,类似于@dano。
感谢您的帮助
答案 0 :(得分:3)
是的,此可能与开销有关,包括:
如果你的机器上确实有4个物理内核(而不是2个超线程或类似内核),你应该看到比率变得更接近大输入的预期,正如切普纳所说。如果您只有2个物理核心,则无法获得比率&lt; 0.5