顺序处理比池处理更快
sequential processing faster than pool processing
我试图理解 map
与 multiprocessing
的用法。为此,我编写了以下 python 程序。但结果似乎让我感到困惑。
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
l = [x for x in range(2000000)]
start = time.clock()
p.map(f, l)
end = time.clock()
print('pool processing time {}'.format(end - start))
start = time.clock()
map(f, l)
end = time.clock()
print('sequential processing time {}'.format(end - start))
我得到的输出如下。
pool processing time 5.576627
sequential processing time 3.220387
为什么顺序处理时间大于池处理时间?我 运行 此代码在 Linux (Ubuntu 14.04 VM) 上分配了两个 CPU。
您的函数 f
过于简单,无法在此处受益。
multiprocessing
的工作方式是分拆整个 Python 程序的副本。如果您的系统有多个 CPU,则这些副本可以 运行 在单独的 CPU 上并行。您可以将它们视为某种 master/slave 排列,原始 Python 程序是 CPU A 上的主程序,而一些从属程序(在本例中为 5 个)在 CPU 从 B 到 F。(他们 没有 有这种 master/slave 关系,但我认为大多数人发现这样更容易思考。 )
然后,每次你的master请求一些slave端的计算时,master将参数值打包(使用pickle
)并发送给slave。1 从服务器执行请求的计算,pickle
给出答案,然后将其发送回主服务器。
在你的例子中,参数是列表中的每个值(加上要调用的函数,见脚注),结果是列表中值的平方。打包和解包值的时间比计算要长得多,因此这是净损失。
如果你做了更多的计算(与基本的通信开销相比),你可能会看到净赢,但如果只有两个 CPUs,那么建立一个大池会适得其反。
1要调用的函数也通过 pickle
结束。
我试图理解 map
与 multiprocessing
的用法。为此,我编写了以下 python 程序。但结果似乎让我感到困惑。
from multiprocessing import Pool
import time
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
l = [x for x in range(2000000)]
start = time.clock()
p.map(f, l)
end = time.clock()
print('pool processing time {}'.format(end - start))
start = time.clock()
map(f, l)
end = time.clock()
print('sequential processing time {}'.format(end - start))
我得到的输出如下。
pool processing time 5.576627
sequential processing time 3.220387
为什么顺序处理时间大于池处理时间?我 运行 此代码在 Linux (Ubuntu 14.04 VM) 上分配了两个 CPU。
您的函数 f
过于简单,无法在此处受益。
multiprocessing
的工作方式是分拆整个 Python 程序的副本。如果您的系统有多个 CPU,则这些副本可以 运行 在单独的 CPU 上并行。您可以将它们视为某种 master/slave 排列,原始 Python 程序是 CPU A 上的主程序,而一些从属程序(在本例中为 5 个)在 CPU 从 B 到 F。(他们 没有 有这种 master/slave 关系,但我认为大多数人发现这样更容易思考。 )
然后,每次你的master请求一些slave端的计算时,master将参数值打包(使用pickle
)并发送给slave。1 从服务器执行请求的计算,pickle
给出答案,然后将其发送回主服务器。
在你的例子中,参数是列表中的每个值(加上要调用的函数,见脚注),结果是列表中值的平方。打包和解包值的时间比计算要长得多,因此这是净损失。
如果你做了更多的计算(与基本的通信开销相比),你可能会看到净赢,但如果只有两个 CPUs,那么建立一个大池会适得其反。
1要调用的函数也通过 pickle
结束。