这是我的代码
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
是这里的主要功能。它做两件事。第一个读取一个分成块的文件,第二个调用另一个函数(从 fortran 程序创建(进行进一步计算。我使用 python 多处理pool
从文件中读取数据块。但是当我将pool
用于计算部分时,它比正常实现慢得多(近 23 倍(。这里发生了什么,我该如何解决?
工作线程和父进程不共享地址空间。
因此,正在处理的数据通过进程间通信(队列(从父级发送到工作线程。如果您有大量数据(在您的例子中为 768 行(,这会产生大量开销。
为每个工作线程提供要使用的切片的边界并让工作线程自己从文件中读取可能是一个更好的策略。这样,您无需将大量数据从父进程移动到工作进程。