使用 "if not in" 循环的 Joblib 太慢

Joblib too slow using "if not in" loop

我正在使用 Biopython 解析器处理氨基酸序列,但无论数据格式如何(格式是 fasta,也就是说,您可以将它们想象成字母串,如下所示,前面有 id),我的问题是我有大量的数据,尽管我试图与 joblib 并行化,但我估计 运行 这个简单代码需要的时间是 400。

基本上我有一个文件,其中包含我必须从原始数据集 (original_dataset) 中删除 (ids_to_drop) 的一系列 ID,以创建一个新文件 (new_dataset) 包含原始数据集中包含的所有 id,没有 ids_to_drop.

我已经尝试了所有方法,但我不知道还能怎么做,我现在被困住了。非常感谢!

def file_without_ids_to_remove(seq):
    with open(new_output, "a") as f, open(ids_to_drop, "r") as r: #output #removing file 
        remove = r.read().split("\n")
        if seq.id not in remove:
            SeqIO.write(seq, f, "fasta")
    

Parallel(n_jobs=10)(delayed(file_without_ids_to_remove)(seq) for seq in tqdm.tqdm(SeqIO.parse(original_dataset, 'fasta')))

需要说明的是,这是数据示例(sequence.id + 序列):

WP_051064487.1 MSSAAQTPEATSDVSDANAKQAEALRVASVNVNGIRASYRKGMAEWLAPRQVDILCLQEVRAPDEVVDGF LADDWHIVHAEAEAKGRAGVLIASRKDSLAPDATRIGIGEEYFATAGRWVEADYTIGENAKKLTVISAYV HSGEVGTQRQEDKYRFLDTMLERMAELAEQSDYALIVGDLNVGHTELDIKNWKGNVKNAGFLPEERAYFD KFFGGGDTPGGLGWKDVQRELAGPVNGPYTWWSQRGQAFDNDTGWRIDYHMATPELFARAGNAVVDRAPS YAERWSDHAPLLVDYTIR

更新:我按照建议尝试了以下方法并且有效。

with open(new_dataset, "w") as filtered:
    [SeqIO.write(seq,filtered,"fasta") for seq in tqdm.tqdm(SeqIO.parse(original_dataset, 'fasta')) if seq.id not in ids_to_remove]

   

这看起来像是一个简单的文件过滤操作。将要删除的 id 一次变成一组,然后 read/filter/write 原始数据集。集合针对快速查找进行了优化。此操作将 I/O 绑定并且不会受益于并行化。

with open("ids-to-remove") as f:
    ids_to_remove = {seq_id_line.strip() for seq_id_line in f}
# just in case there are blank lines
if "" in ids_to_remove:
    ids_to_remove.remove("")
with open("original-data-set") as orig, open("filtered-data-set", "w") as filtered:
    filtered.writelines(line for line in orig if line.split()[0] not in ids_to_remove)