我正在尝试在Python中分析一个基本函数,以查看多线程的评估结果的比较优势。随着应用函数的数据大小的增加,线程版本似乎越来越差。启动线程的开销是否在这里我没有考虑到?有人可以解释如何实际实现多线程优化/我做错了吗?
from multiprocessing import Pool
def f(x):
return x*x
pool = Pool(processes=4)
import timeit
print timeit.timeit('map(f, range(20000000))', setup = "from __main__ import f", number = 1)
print timeit.timeit('pool.map(f, range(20000000))', setup = "from __main__ import f, pool", number = 1)
结果:
5.90005707741
11.8840620518
[Finished in 18.9s]
如果相关,我在Sublime Text 3中运行了这个。
答案 0 :(得分:1)
"工作单位"你在每份工作中做得太小了。当你" map"这通常是一个问题。像这样的工作 - 映射过程的开销占主导地位。当然,将作业映射到单独的进程比在同一进程中映射更耗时,因此多进程解决方案速度较慢也就不足为奇了。
尝试使用可以进行更多计算的函数,您将看到多处理的好处。
答案 1 :(得分:0)
@john已经给出了答案,但我想提供一个例子
from multiprocessing import Pool
def f(n):#fibonacci
if n == 0:
return 0
elif n == 1:
return 1
else:
return f(n-1) + f(n-2)
pool = Pool(processes=4)
import timeit
print timeit.timeit('map(f, xrange(35))', setup = "from __main__ import f", number = 1)
print timeit.timeit('pool.map(f, xrange(35))', setup = "from __main__ import f, pool", number = 1)
结果:
4.349
2.497