python中嵌套循环的多处理

2024-10-03 15:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要写一些从两个不同的非常大的列表输入的文件。以下python代码可以工作,但是由于列表和其他变量的大小,运行起来需要很长时间:

for n,seq in enumerate(ugFA):    
    with open("locusFASTAs/"+loci[n], 'a') as outFA:
        SeqIO.write(ugSeqs[seq.id], outFA, 'fasta')
        for m,i in enumerate(wantedContigs):
            if f[m].id==seq.id:
                SeqIO.write(MergeSeqs[i], outFA, 'fasta')
            else: continue

上述代码中的数据结构:

  • ugFA是一个列表
  • 地点是一个列表
  • ugSeqs是一本字典
  • wantedContigs是一个列表
  • f是一个列表
  • MergeSeqs是一本字典

我试图使用multiprocessing来并行化代码。下面的代码完成了这项工作,但是(i)的运行速度并不快,(ii)似乎使用的CPU不超过100%,并且(iii)在完成时会显示以下错误消息,即使它完成了循环中的任务:

^{pr2}$

在我的代码构建过程中,我是否做错了什么?我能正确地构造它以充分利用multiprocessing模块的便利性吗?在


Tags: 代码inid列表forseqfastawrite
1条回答
网友
1楼 · 发布于 2024-10-03 15:32:09

问题是

r = pool.map(extractContigs(ugFA, loci, ugSeqs, wantedContigs, MergeSeqs))

正在调用函数extractContigs(在主线程中,因此是100%CPU),然后将结果作为参数传递给pool.mapThe correct signature

^{pr2}$

为了在您的案例中起作用,您需要重写extractContigs函数,使其只接受一个参数。从外观上看,您需要对代码进行显著的重构才能做到这一点。同时写入同一个文件可能是个问题。在

您以前的版本可以适当修改:

def writeLocus(n):
    seq = ugFa[n]  
    with open("locusFASTAs/"+loci[n], 'a') as outFA:
        SeqIO.write(ugSeqs[seq.id], outFA, 'fasta')
        for m,i in enumerate(wantedContigs):
            if f[m].id==seq.id:
                SeqIO.write(MergeSeqs[i], outFA, 'fasta')
            else: continue

pool.map(writeLocus, range(len(ugFa)))

请确保输出中的内容不会因为并行写入相同的文件而变得混乱。理想情况下,最好让每个工作线程写入自己的文件,然后再合并。在

相关问题 更多 >