代码1:16秒内执行
def mc05():
num_procs = 4
iters = 1000000000
its = iters / num_procs
pool = mp.Pool(processes=num_procs)
result = pool.map(mpf.integrate3, [its] * num_procs)
print(sum(result) / float(num_procs))
pool.terminate(); pool.join();
Code2:时间执行:32秒(= 1个进程)
def mc05():
num_procs = 4
iters = 1000000000
its = iters / num_procs
pool = mp.Pool(processes=num_procs)
result = pool.map(mpf.integrate3, [iters] )
print(sum(result) / float(num_procs))
pool.terminate(); pool.join();
唯一的区别来自于代码2中的列表,它已被简化....为什么会有所不同?
答案 0 :(得分:1)
pool = mp.Pool(processes=num_procs)
告诉多处理,要运行多少个并发进程,在你的情况下为4。但只有在输入列表大于4时才会启动4个进程。
现在你做的时候
pool.map(mpf.integrate3, [iters] )
您的[iters]
列表只有一个值,即[1000000000]
,因此只会启动一个进程。
当你这样做时
result = pool.map(mpf.integrate3, [its] * num_procs)
您的列表[its] * num_procs
有4个值,即[250000000, 250000000, 250000000, 250000000]
,因此将按池启动4个进程。
答案 1 :(得分:0)
代码1
... [its] * num_procs == [its, its, its, its]
代码2
... [iters] == [1000000000]
map函数遍历列表。在Code2中,它只迭代一个值。 Code1正在遍历一个大小为4的列表,为列表中的每个项调用该函数。您应该检查两行代码是否获得相同的结果。我对mpf.integrate3不是很熟悉,但是map4的地图函数运行速度通过4号列表的速度会慢一些。要么Code2或Code2较慢,因为列表[1000000000]上只运行一个进程。我不太清楚它是如何工作的,因为我对多处理池并不熟悉。