Python 多处理代码 运行 比单线程代码慢

Python multiprocessing code running slower than single threaded one

我的 i7 7700HQ 上的 Python 多处理性能明显低于非并行处理器。

虽然计划在 mssql 中为我的单个 table 数据库并行化我的 Select 和更新代码,但我尝试首先并行化一个简单的代码。该程序只是打印参数的倍数。 我尝试使用 Process 对象和 Pool 对象进行单线程、多进程。单线程总是表现最好。

import time

def foobar(a):
    for i in range(1,10000):
        print(a*i)
    return
if __name__ == "__main__":
   Tthreading = time.clock()
    p1= Process(target= foobar, args=(3,))
    p2 = Process(target= foobar, args= (2,))
    p3 = Process(target= foobar, args= (4,))
    p4 = Process(target=foobar, args=(123,))

    allprocess.start

    allprocess.join

    print(time.clock() - Tthreading)

    #Single-threaded
    Tsingle = time.clock()
    foobar(3)
    foobar(2)
    foobar(4)
    foobar(123)
    print(time.clock() - Tsingle)


我预计多进程会更快,因为没有共享资源(没有线程间需要访问的函数、变量)和 IPC。

单线程时间:0.32s

多进程时间:0.53s

实际上,您的示例中有一项重要的共享资源,即您的显示器(或stdout)。

print 是一个相对较慢的操作(与 CPU 周期相比......),它会导致进程之间发生争用。

正确地对并行工作进行基准测试是一项艰巨的任务,它受到CPU(例如缓存)的许多因素和特性的影响。

尝试将您的工作负载替换为非常适合多处理的工作负载(例如,并行处理数组的不同部分、矩阵乘法...)

还有一件更重要的事情:产生新流程也需要时间,并且要使每个流程中完成的工作得到回报,就需要大量的时间。 如果稍微增加循环的范围,差异应该有利于 Multi-process 版本:

import time
from multiprocessing import Process

def foobar(a):
    for i in range(1,10000000):
        a*i
    return

if __name__ == "__main__":
    Tthreading = time.time()
    p1= Process(target= foobar, args=(3,))
    p2 = Process(target= foobar, args= (2,))
    p3 = Process(target= foobar, args= (4,))
    p4 = Process(target=foobar, args=(123,))

    allprocess = [p1,p2,p3,p4]
    for p in allprocess:
        p.start()

    for p in allprocess:
        p.join()

    print(time.time() - Tthreading)

    #Single-threaded
    Tsingle = time.time()
    foobar(3)
    foobar(2)
    foobar(4)
    foobar(123)
    print(time.time() - Tsingle)

在我的机器上输出:

0.44509196281433105

1.3775699138641357