如何提高这段代码中的并发处理时间?

问题描述 投票:0回答:1

我用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 

如何提高并发时间?因为顺序时间一直越来越快还是有原因?

python concurrency
1个回答
0
投票

“如何提高并发时间?”

避免所有流程实例化成本,并使用内存 I/O 高效矢量化代码来完成其余部分,最好与

numpy
-广播

结合使用
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

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.