Python的多处理速度(Python multiprocessing speed)

2019-09-18 15:20发布

我写了这段代码来测试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

Answer 1:

为什么它应该。

在地图功能,你只是调用顺序的功能。

多处理池创建一组工人到你的任务将被映射。 它是协调多个工作进程来运行这些功能。

试着做你的函数里面的一些显著的工作,然后按时间,看看他们是否多可以帮助你更快地计算。

你必须明白,会有使用多开销。 只有当计算力大于这些开销,你会看到它的好处显著更大。

见由赫尔曼出色地介绍了最后一个例子: 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)

您取决于你有核心创建池。



Answer 2:

有使用并行的开销。 只有好处,如果每个工作单元需要足够长的时间来弥补开销。

此外,如果你只需要你的机器上的一个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)


文章来源: Python multiprocessing speed