簡體   English   中英

在Python中並行進行for循環

[英]Parallelize for-loop in python

我有一組簡單的代碼,可以從Python運行Clustal Omega(蛋白質多序列比對程序):

from Bio.Align.Applications import ClustalOmegaCommandline

segments = range(1, 9)
segments.reverse()

for segment in segments:
    in_file = '1.0 - Split FASTA Files/Segment %d.fasta' % segment
    out_file = '1.1 - Aligned FASTA Files/Segment %d Aligned.fasta' % segment
    distmat = '1.1 - Distmats/Segment %d Distmat.fasta' % segment

    cline = ClustalOmegaCommandline(infile=in_file, 
                                    outfile=out_file, 
                                    distmat_out=distmat, 
                                    distmat_full=True, 
                                    verbose=True,
                                    force=True)
    print cline
    cline()

我已經在進行多序列比對(MSA)的時間進行了一些非正式測試。 平均每個人需要4個小時。 一個接一個地跑所有8個球,總共花了我32個小時。 因此,這是我將其作為for循環運行的初衷-我可以讓它運行而不必擔心。

但是,我又進行了一次非正式測試-我從打印的cline中獲取輸出,然后將其復制並粘貼到分布在兩台計算機上的8個單獨的終端窗口中,並以此方式運行MSA。 平均而言,每個人花了大約8個小時左右...但是由於它們都同時運行,所以我只花了8個小時就得到了結果。

在某些方面,我發現了並行處理! :d

但是我現在面臨着如何使其在Python中運行的難題。 我曾嘗試查看以下SO帖子,但似乎仍無法圍繞多處理模塊的工作原理進行總結。

職位清單:

有人願意分享他們如何並行化此循環嗎? 我確實有很多循環看起來與此循環類似,在該循環中,我對文件執行了一些操作並寫入了另一個文件,而無需將結果匯總到內存中。 我面臨的特定區別是需要執行文件I / O,而不是匯總來自循環並行運行的結果。

您可能正在尋找Joblib庫

讓我舉一個使用它的例子:

import time
from joblib import Parallel, delayed


def long_function():
    time.sleep(1)


REPETITIONS = 4
Parallel(n_jobs=REPETITIONS)(
    delayed(long_function)() for _ in range(REPETITIONS))

此代碼將在1秒而不是4秒內運行。

修改您的代碼看起來像這樣(對不起,我無法測試這是否正確):

from joblib import Parallel, delayed

from Bio.Align.Applications import ClustalOmegaCommandline


def run(segment):
    in_file = '1.0 - Split FASTA Files/Segment %d.fasta' % segment
    out_file = '1.1 - Aligned FASTA Files/Segment %d Aligned.fasta' % segment
    distmat = '1.1 - Distmats/Segment %d Distmat.fasta' % segment
    cline = ClustalOmegaCommandline(infile=in_file,
                                    outfile=out_file,
                                    distmat_out=distmat,
                                    distmat_full=True,
                                    verbose=True,
                                    force=True)
    print cline
    cline()


if __name__ == "__main__":
    segments = range(1, 9)
    segments.reverse()

    Parallel(n_jobs=len(segments)(
        delayed(run)(segment) for segment in segments)

寫入def f(segment) ,然后使用multiprocessing.Pool().map(f, segments)而不是for segment in segments multiprocessing.Pool().map(f, segments)

弄清楚如何將其放在上下文中作為練習留給讀者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM