python 多处理不工作?
python multiprocessing not working?
代码:
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 --- time:1.7011
par --- time:2.3112
我的 mac 有一个处理器,两个物理内核,每个物理内核有 2 个虚拟内核。所以,我认为并行 运行 应该没问题,以获得一些加速。但是,从输出来看,并行版本比顺序版本慢。为什么会这样?
规格:
问题是您并行化的操作不是很昂贵,这抵消了 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
内部花费的额外时间使并行版本的速度是顺序版本的两倍,这与预期的性能改进是正确的。
代码:
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 --- time:1.7011
par --- time:2.3112
我的 mac 有一个处理器,两个物理内核,每个物理内核有 2 个虚拟内核。所以,我认为并行 运行 应该没问题,以获得一些加速。但是,从输出来看,并行版本比顺序版本慢。为什么会这样?
规格:
问题是您并行化的操作不是很昂贵,这抵消了 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
内部花费的额外时间使并行版本的速度是顺序版本的两倍,这与预期的性能改进是正确的。