【问题标题】:python multiprocessing not working?python多处理不起作用?
【发布时间】:2015-11-30 16:39:11
【问题描述】:

代码:

import multiprocessing as mp
import time

def seq(count):
    print "runing seq"
    start_time = time.time()
    result = []
    for i in range(count):
        result.append(cube(i))
    print "seq --- time:{0:.4f}".format(time.time() - start_time)
    #print "seq --- time:{0:.4f}, result:{1}".format(time.time() - start_time, result)

def par(count):
    print "runing par"
    start_time = time.time()
    result = mp.Pool(processes=2).map(cube,range(count))
    print "par --- time:{0:.4f}".format(time.time() - start_time)
    #print "par --- time:{0:.4f}, result:{1}".format(time.time() - start_time, result)

def cube(x):
    return x*x*x


count = 4000000
seq(count)
par(count)

输出:

seq --- 时间:1.7011

标准 --- 时间:2.3112

我的 mac 有一个处理器,两个物理内核,每个物理内核有 2 个虚拟内核。所以,我认为它应该可以很好地并行运行以获得一些加速。然而,从输出来看,并行版本比顺序版本慢。为什么会这样?

规格:

【问题讨论】:

    标签: python parallel-processing multiprocessing python-multiprocessing


    【解决方案1】:

    问题是您并行化的操作不是很昂贵,这抵消了multiprocessing 的好处。使用multiprocessing 会带来一些开销;启动子进程并将数据从父进程移动到这些子进程需要大量时间(尤其是与线程解决方案相比)。如果您在后台进程中执行的实际工作非常小,那么在进程之间移动数据的开销实际上最终可能会大于通过并行工作节省的时间。

    如果您在测试代码中添加一个简短的time.sleep,您可以更清楚地看到这一点(并减少运行次数,因此您不会永远等待):

    import multiprocessing as mp
    import time
    
    def seq(count):
        print "runing seq"
        start_time = time.time()
        result = []
        for i in range(count):
            result.append(cube(i))
        print "seq --- time:{0:.4f}".format(time.time() - start_time)
        #print "seq --- time:{0:.4f}, result:{1}".format(time.time() - start_time, result)
    
    def par(count):
        print "runing par"
        start_time = time.time()
        result = mp.Pool(processes=2).map(cube,range(count))
        print "par --- time:{0:.4f}".format(time.time() - start_time)
        #print "par --- time:{0:.4f}, result:{1}".format(time.time() - start_time, result)
    
    def cube(x):
        time.sleep(.01)
        return x*x*x
    
    if __name__ == "__main__":    
        count = 400
        seq(count)
        par(count)
    

    输出:

    runing seq
    seq --- time:4.0488
    runing par
    par --- time:2.0408
    

    在cube 中花费的额外时间使并行版本的速度是顺序版本的两倍,这与预期的性能提升是正确的。

    【讨论】:

    • 值得一提的是multiprocessing 要求__main__ 模块可由子模块(docs.python.org/3.5/library/multiprocessing.html)导入,因此对seq 和par 的调用需要受if __name__ == '__main__': 块保护。
    • @Nathaniel 这仅在 Windows 上是必需的,但绝对值得向其他看到此内容的人指出。我已经相应地更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 2014-11-13
    • 2013-02-20
    • 1970-01-01
    • 2018-10-26
    • 2020-12-26
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多