2012-06-27 60 views
4

我写的这段代码来测试Python的多我的电脑上:Python的多速度

from multiprocessing import Pool 

var = range(5000000) 
def test_func(i): 
    return i+1 

if __name__ == '__main__': 
    p = Pool() 
    var = p.map(test_func, var) 

我计时此使用Unix的time命令,结果是:

real 0m2.914s 
user 0m4.705s 
sys 0m1.406s 

然后,使用同样vartest_func()我计时:

var = map(test_func, var) 

,结果我们再

real 0m1.785s 
user 0m1.548s 
sys 0m0.214s 

不应该多码比普通的老map快得多?

回答

5

为什么它应该。

在map函数中,您只是按顺序调用函数。

多处理池创建一组将要映射任务的工作人员。 它正在协调多个工作进程来运行这些功能。

尝试在你的函数中做一些重要的工作,然后计算它们,看看多处理能否帮助你更快计算。

您必须明白,使用多处理会产生开销。只有在计算工作量明显大于这些开销时,您才会看到它的好处。

由赫尔曼见出色地介绍了最后一个例子:http://www.doughellmann.com/PyMOTW/multiprocessing/communication.html

pool_size = multiprocessing.cpu_count() * 2 
pool = multiprocessing.Pool(processes=pool_size, 
          initializer=start_process, 
          maxtasksperchild=2, 
          ) 
pool_outputs = pool.map(do_calculation, inputs) 

创建取决于你有内核池。

3

使用并行化存在开销。如果每个工作单位花费足够的时间来补偿开销,那么只有好处。

此外,如果您的计算机上只有一个CPU(或CPU线程),则完全没有必要使用并行化。如果您至少拥有一台超线程机器或至少两个CPU内核,则只会看到收益。

在你的情况下,一个简单的加法操作不会补偿这种开销。

尝试一些更昂贵,如:

from multiprocessing import Pool 
import math 

def test_func(i): 
    j = 0 
    for x in xrange(1000000): 
     j += math.atan2(i, i) 
    return j 

if __name__ == '__main__': 
    var = range(500) 
    p = Pool() 
    var = p.map(test_func, var)