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