测试python多处理:由于开销低速?

时间:2014-10-29 12:22:59

标签: python performance multiprocessing

我正在尝试在python(2.7)中了解multiprocessing。我的CPU有4个核心。在下面的代码中我测试了并行Vs串行执行相同基本指令的速度。

我发现使用4个核心所花费的时间仅为0.67,只有一个核心所占用的时间,而天真地我期望~0.25。

是开销的原因吗?它从何而来? 4个过程不是独立的吗?

我还尝试了pool.mappool.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。

感谢您的帮助

1 个答案:

答案 0 :(得分:3)

是的,此可能与开销有关,包括:

  • 创建和启动流程
  • 将函数和参数传递给它们
  • 等待进程终止

如果你的机器上确实有4个物理内核(而不是2个超线程或类似内核),你应该看到比率变得更接近大输入的预期,正如切普纳所说。如果您只有2个物理核心,则无法获得比率&lt; 0.5