Python多处理速度

时间:2012-06-27 15:25:21

标签: python multiprocessing

我编写了这段代码来测试我的计算机上的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快得多吗?

2 个答案:

答案 0 :(得分:6)

为什么要这样做。

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

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

尝试在您的函数中执行一些重要的工作,然后计算它们,看看多处理是否可以帮助您更快地计算。

您必须了解使用多处理会产生开销。只有当计算工作量大大超过这些开销时,您才会看到它的好处。

请参阅Hellmann出色介绍的最后一个例子: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)

您可以根据自己拥有的核心创建池。

答案 1 :(得分: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)