我编写了这段代码来测试我的计算机上的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
然后,使用相同的var
和test_func()
我定时:
var = map(test_func, var)
结果是
real 0m1.785s
user 0m1.548s
sys 0m0.214s
多处理代码不应该比普通的map
快得多吗?
答案 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)