多处理映射python速度问题与列表

时间:2016-02-05 13:00:04

标签: python multithreading numpy multiprocessing

我有两条相似的代码,速度差别很大:

代码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中的列表,它已被简化....为什么会有所不同?

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]上只运行一个进程。我不太清楚它是如何工作的,因为我对多处理池并不熟悉。