[英]how to parallel running of python scripts on bioinformatics
我希望使用 python 讀取 fasta 序列文件並將其轉換為熊貓 dataframe。 我使用以下腳本:
from Bio import SeqIO
import pandas as pd
def fasta2df(infile):
records = SeqIO.parse(infile, 'fasta')
seqList = []
for record in records:
desp = record.description
# print(desp)
seq = list(record.seq._data.upper())
seqList.append([desp] + seq)
seq_df = pd.DataFrame(seqList)
print(seq_df.shape)
seq_df.columns=['strainName']+list(range(1, seq_df.shape[1]))
return seq_df
if __name__ == "__main__":
path = 'path/to/the/fasta/file'
input = path + 'GISAIDspikeprot0119.selection.fasta'
df = fasta2df(input)
'GISAIDspikeprot0119.selection.fasta' 文件位於https://drive.google.com/file/d/1F5Ir5S6h9rFsVUQkDdZpomiWo9_bXtaW/view?usp=sharing
該腳本可以在我的 linux 工作站上僅使用一個 cpu 內核運行,但是是否可以使用更多內核(多個進程)運行它以便運行得更快? 那將是什么代碼?
非常感謝!
在為您的問題投入更多 CPU 之前,您應該花一些時間檢查代碼的哪些部分運行緩慢。
在您的情況下,您在每次循環迭代中執行昂貴的轉換seq_df = pd.DataFrame(seqList)
。 這只是在浪費 CPU 時間,因為結果seq_df
在下一次迭代中被覆蓋。
你的代碼在我的機器上用了 15 分鍾。 將pd.DataFrame(seqList)
和print
語句移出循環后,它下降到約 15 秒。
def fasta2df(infile):
records = SeqIO.parse(infile, 'fasta')
seqList = []
for record in records:
desp = record.description
seq = list(record.seq._data.upper())
seqList.append([desp] + seq)
seq_df = pd.DataFrame(seqList)
seq_df.columns = ['strainName'] + list(range(1, seq_df.shape[1]))
return seq_df
事實上,幾乎所有的時間都花在seq_df = pd.DataFrame(seqList)
——對我來說大約是 13 秒。 通過將 dtype 顯式設置為 string,我們可以將其降低到 ~7 秒:
def fasta2df(infile):
records = SeqIO.parse(infile, 'fasta')
seqList = []
for record in records:
desp = record.description
seq = list(record.seq._data.upper())
seqList.append([desp] + seq)
seq_df = pd.DataFrame(seqList, dtype="string")
seq_df.columns = ['strainName'] + list(range(1, seq_df.shape[1]))
return seq_df
有了這種新的性能,我非常懷疑您是否可以通過並行處理進一步提高速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.