python多处理不起作用?

python多处理不起作用?,python,parallel-processing,multiprocessing,python-multiprocessing,Python,Parallel Processing,Multiprocessing,Python Multiprocessing,代码: 输出: 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() - star

代码:

输出:

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)
序号——时间:1.7011

标准杆时间:2.3112

我的mac有一个处理器,两个物理核,每个物理核有两个虚拟核。因此,我认为并行运行可以获得一些加速。然而,从输出来看,并行版本比顺序版本慢。为什么会这样

规格:


问题是,您正在并行化的操作并不十分昂贵,这否定了
多处理的好处。使用
多处理
会带来一些开销;启动子进程并将数据从父进程移动到这些子进程需要相当长的时间(特别是与线程解决方案相比)。如果您在后台进程中所做的实际工作非常小,那么在进程之间移动数据的开销实际上可能会超过并行化工作所节省的时间

如果您在测试代码中添加一段短的
时间。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)

多维数据集中花费的额外时间使得并行版本的速度是顺序版本的两倍,这与预期的性能改进是正确的。

值得一提的是,
多处理
要求子模块可以导入
\uuuu主模块(),所以对
seq
par
的调用需要受到
的保护,如果uuuu name\uuuuu=='\uuuu main\uuuu':
块。@Nathaniel这只在Windows上是必需的,但对于其他看到这一点的人来说绝对值得一提。我已经相应地更新了我的答案。
runing seq
seq --- time:4.0488
runing par
par --- time:2.0408