为什么这个多进程程序的运行速度比非并发版本慢



我制作了一个程序,通过将列表划分为子部分并在Python中使用多处理来添加列表。我的代码如下:

from concurrent.futures import ProcessPoolExecutor, as_completed
import random
import time

def dummyFun(l):
s=0
for i in range(0,len(l)):
s=s+l[i]
return s

def sumaSec(v):
start=time.time()
sT=0
for k in range(0,len(v),10):
vc=v[k:k+10]
print ("vector ",vc)
for item in vc:
sT=sT+item
print ("sequential sum result ",sT)
sT=0
start1=time.time()
print ("sequential version time ",start1-start)


def main():
workers=5
vector=random.sample(range(1,101),100)
print (vector)
sumaSec(vector)
dim=10
sT=0
for k in range(0,len(vector),dim):
vc=vector[k:k+dim]
print (vc)
for item in vc:
sT=sT+item
print ("sub list result ",sT)
sT=0

chunks=(vector[k:k+dim] for k in range(0,len(vector),10))
start=time.time()
with ProcessPoolExecutor(max_workers=workers) as executor:
futures=[executor.submit(dummyFun,chunk) for chunk in chunks]
for future in as_completed(futures):
print (future.result())
start1=time.time()
print (start1-start)
if __name__=="__main__":
main()

问题是,对于顺序版本,我得到了一个时间:

0.0009753704071044922

而对于并发版本,我的时间是:

0.10629010200500488

当我将员工人数减少到2人时,我的时间是:

0.08622884750366211

为什么会发生这种情况?

向量的长度只有100。这是一个非常小的工作量,因此启动流程池的固定成本是运行时最重要的部分。因此,当有很多工作要做时,并行性是最有益的。尝试一个更大的向量,比如100万的长度。

第二个问题是,你让每个工人做少量的工作:10号的大块。同样,这意味着启动一项任务的成本不能在这么少的工作量上摊销。使用较大的块。例如,使用int(len(vector)/(workers*10))代替10

还要注意,您正在创建5个流程。对于像这样的CPU绑定任务,理想情况下,您希望使用与物理CPU内核相同数量的进程。无论您的系统有多少个核心,都可以使用,或者如果您使用max_workers=None(默认值(,则ProcessPoolExecutor将默认为您系统的那个数字。如果你使用的进程太少,你就会把性能留在桌面上,如果你使用了太多,那么CPU将不得不在它们之间切换,你的性能可能会受到影响。

您的分块对于创建多个任务来说非常糟糕。创建过多的任务仍然会招致时间惩罚,即使你的员工已经创建好了。

也许这篇文章可以帮助你搜索:如何在Python 中使用多处理并行求和循环