0

我在 Python 中编写了以下代码:

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

def addS(v):
    s=0
    start=time.time()
    for i in range(0,len(v)):
        s=s+v[i]
    start1=time.time()
    print ("sec time ",start1-start," sum is ",s)

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

def main():
    workers=4
    v = [random.randint(1,101) for _ in range(1000000)]
    addS(v)
    dim=(int)(len(v)/(workers*10))
    s=0
        
    chunks=(v[k:k+dim] for k in range(0,len(v),(int)(len(v)/(workers*10))))
    start=time.time()
   
    with ProcessPoolExecutor(max_workers=4) as executor:
        futures=[executor.submit(dummyFun,chunk) for chunk in chunks]
    
    start1=time.time()

    for future in as_completed(futures):
        s=s+future.result()
    print ("concurrent time ",start1-start," sum is ",s)

当我使用ProcessPoolExecutor()我的结果如下:

       sec time  0.06529831886291504  sum is  51004089
concurrent time  0.5757372379302979   sum is  51004089

我也改成,ThreadPoolExecutor()结果是:

       sec time  0.06471061706542969  sum is  50981197
concurrent time  0.09298276901245117  sum is  50981197

另外,当我将max_workers参数设置为时None,我得到以下结果:

       sec time  0.06425285339355469  sum is  50983899
concurrent time  0.09010934829711914  sum is  50983899 

如何提高并发时间?因为连续时间一直在变快,还是有原因?

4

1 回答 1

0

“我怎样才能提高我的并发时间?”

避免所有进程实例化成本,其余部分使用内存 I/O 高效矢量化代码,最好与numpy-broadcasting结合使用

s = np.random.randint( 1, 101, size = 1_000_000, dtype = np.int8 ).sum()

硬件 AVX 性能可以胜过任何其他纯软件技巧。

对于测试,首先并且总是预先设置是公平的,np.random.seed( seed = someHausNumero )否则所有测试都不再是可重复的,每次都提供不同的结果,这是严肃的、可重复的科学永远不想要的,不是吗?

:o)


谢谢@user3666197,但我怀疑为什么我的顺序时间比并发版本短?也许是因为列表操作在 Python 中进行了优化?– 小13 分钟前

拥有少量项目(1E6是数据的一小部分),流程实例化和类似...PoolExecutor()的开销会带来比拆分工作能够偿还至少盈亏平衡状态(不支付)更多的成本比以往任何时候都更回来)。尝试使用缓存外、内存 I/O 更密集的大小,远高于1E10+字节(假设你有足够的 RAM / 交换空间,当然)

虽然上面的问题是“公正的” ——[ CONCURRENT ]处理任务流的编排,但您可能想阅读一些关于附加开销成本和工作原子性的细节,这两者都会影响最大实际可实现的加速,比较到纯[ SERIAL ](或顺序)工作流程 >>> https://stackoverflow.com/revisions/18374629/3

附加成本的性质是相同的 - 参数需要 SER/comms/DES + 结果需要 SER/comms/DES 以及所有来自内存分配附加成本和内存 I/O 成本的内容 - 参见这个 >>> https://stackoverflow.com/questions/4087280/approximate-cost-to-access-various-caches-and-main-memory/33065382?r=SearchResults&s=2|0.0000#33065382

于 2020-12-01T21:09:11.387 回答