python多处理比正常实现慢

时间:2017-03-23 18:50:47

标签: python multiprocessing

所以这是我的代码

def get_h(tmp):                                                                   
    tmp =[map(float,line.split()[3:6]) for line in tmp[:768]]
    return hbond(tmp,side)

def get_sc(tmp):
    return popvar(tmp)

def calculate():                                   
    hframe=[]
    pl=Pool() 
    s=time()                                     
    with open(file) as f:
        for _ in xrange(100):
            tmp=list(islice(f,9,9+atoms))          
            if not tmp: break
            hframe.append(pl.apply_async(get_h,[tmp]))  
    hframe=[i.get() for i in hframe]
    print time()-s   #takes ~ 1 sec

    s=time()
    ll=[pl.apply_async(get_sc,[tmp]) for tmp in izip(*hframe)]
    ll=[i.get() for i in ll]
    print time()-s #takes ~23 sec !!!

    s=time()
    ll=[get_sc(tmp) for tmp in izip(*hframe)]
    print time()-s #takes ~ 1 sec

calculate是这里的主要功能。它做了两件事。 1st读取分为块的文件,2nd调用另一个函数(从fortran程序创建)进行进一步计算。我使用python multiprocessing pool从文件中读取数据块。但是当我使用pool作为计算部分时,它比正常实现慢得多(近23倍)。这里发生了什么,我该如何解决?

1 个答案:

答案 0 :(得分:0)

工作人员和父进程不共享地址空间。

因此,正在处理的数据通过进程间通信(队列)从父级发送到工作者。 如果您有大量数据(在您的情况下为768行),则会产生大量开销。

让每个工作人员使用切片的边界并让工作人员自己从文件中读取可能是一种更好的策略。这样,您就不需要将大量数据从父进程移动到工作进程。