我目前正在重新设计一个程序来使用Python的多处理池。我的第一印象是执行时间增加而不是减少。因此,我很好奇并写了一个小测试脚本:
import time
import multiprocessing
def simple(x):
return 2*x
def less_simple(x):
b = x
for i in range(0, 100):
b = b * i
return 2*x
a = list(range(0,1000000))
print("without multiprocessing:")
before = time.time()
res = map(simple, a)
after = time.time()
print(str(after - before))
print("-----")
print("with multiprocessing:")
for i in range(1, 5):
before = time.time()
with multiprocessing.Pool(processes=i) as pool:
pool.map(simple, a)
after = time.time()
print(str(i) + " processes: " + str(after - before))
我得到以下结果:
没有多处理: 2.384185791015625e-06
多处理:
1个流程:0.35068225860595703
2个过程:0.21297240257263184
3个过程:0.21887946128845215
4个流程:0.3474385738372803
当我用第21行和第31行中的less_simple替换simple时,我得到以下结果:
没有多处理: 2.6226043701171875e-06
多处理:
1个流程:3.1453816890716553
2个流程:1.615351676940918
3个流程:1.6125438213348389
4个流程:1.5159809589385986
老实说,我有点困惑,因为非多处理版本总是快一些数量级。此外,进程数的增加似乎对运行时几乎没有影响。因此,我有几个问题:
答案 0 :(得分:0)
我做了更多的研究,基本上,你是对的。这两个功能都相当小,有点人为。但是,当您考虑地图的工作原理时,即使对于这些功能,非多处理和多处理之间也存在可测量的时间差。 map函数只返回一个产生结果[1]的迭代器,即在上面的例子中,它只创建迭代器,当然它非常快。 因此,我用传统的for循环替换了map函数:
for elem in a:
res = simple(a)
对于简单的函数,没有多处理,执行仍然更快,因为对于这么小的函数来说开销太大了:
没有多处理:
多处理:
但是,如果函数less_simple,您可以看到多处理的实际优势:
没有多处理:
多处理: