6

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

4

2 回答 2

7

为什么应该。

在 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)

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

于 2012-06-27T15:28:14.023 回答
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)
于 2012-06-27T15:38:29.017 回答