我写了这段代码来测试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
?
为什么它应该。
在地图功能,你只是调用顺序的功能。
多处理池创建一组工人到你的任务将被映射。 它是协调多个工作进程来运行这些功能。
试着做你的函数里面的一些显著的工作,然后按时间,看看他们是否多可以帮助你更快地计算。
你必须明白,会有使用多开销。 只有当计算力大于这些开销,你会看到它的好处显著更大。
见由赫尔曼出色地介绍了最后一个例子: 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)
您取决于你有核心创建池。
有使用并行的开销。 只有好处,如果每个工作单元需要足够长的时间来弥补开销。
此外,如果你只需要你的机器上的一个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)