今回は塩基配列処理において、biopythonを使用した方法とそうではない方法(ゴリ押し)での処理速度を具体的に比較していきます。
Biopythonでの処理時間をT1、通常処理での処理時間をT2としT1/T2を見ることでどちらがどれだけ早く処理できるかを確かめます。
ターゲット配列は数千ヌクレオチドほどで、処理時間の差がわからないためループで同じ処理をそれぞれ100回行います。
目次
標準ライブラリの場合
標準ライブラリを使用して転写および翻訳を行います。
初めに、timeを使用して、処理時間を計測するコードです。
処理終了時の時刻から開始時刻を引いて実行時間を表示するシンプルなコードです。
基本的には###########################の部分に処理内容を書いていくことになります。
import time
from seq import seq as seq_DNA
start = time.time()
#########################
process_time = time.time() - start
print(process_time)
(1)Transcribe(転写)
ここでは転写を塩基配列中のTをUに置換すると考えます。
seq_mRNA = seq_DNA.replace("T","U")
#seq_mRNAに転写後の配列を代入します。
(2)Translate(翻訳)
すこし大掛かりですが、全コドンに対応するアミノ酸を出力する関数を作ります。
変数aminoacid に対応するアミノ酸を代入後、返値とします。(シンプルですが、作るのはめんどくさかったです。)
def codon_2_aminoacid(codon):
#引数はcodonとします。
aminoacid = ""
if codon == "UUU" or codon == "UUC":
aminoacid += "F"
elif codon == "UUA" or codon == "UUG" or codon == "CUU" or codon == "CUC" or codon == "CUA" or codon == "CUG":
aminoacid += "L"
elif codon == "AUU" or codon == "AUC" or codon == "AUA":
aminoacid += "I"
elif codon == "GUU" or codon == "GUC" or codon == "GUA" or codon == "GUG":
aminoacid += "V"
elif codon == "UCU" or codon == "UCC" or codon == "UCA" or codon == "UCG":
aminoacid += "S"
elif codon == "CCU" or codon == "CCC" or codon == "CCA" or codon == "CCG":
aminoacid += "P"
elif codon == "ACU" or codon == "ACC" or codon == "ACA" or codon == "ACG":
aminoacid += "U"
elif codon == "GCU" or codon == "GCC" or codon == "GCA" or codon == "GCG":
aminoacid += "A"
elif codon == "UAU" or codon == "UAC":
aminoacid += "Y"
elif codon == "CAU" or codon == "CAC":
aminoacid += "H"
elif codon == "CAA" or codon == "CAG":
aminoacid += "Q"
elif codon == "AAU" or codon == "AAC":
aminoacid += "N"
elif codon == "AAA" or codon == "AAG":
aminoacid += "K"
elif codon == "GAU" or codon == "GAC":
aminoacid += "D"
elif codon == "GAA" or codon == "GAG":
aminoacid += "E"
elif codon == "UGU" or codon == "UGC":
aminoacid += "C"
elif codon == "UGG":
aminoacid += "W"
elif codon == "CGU" or codon == "CGC" or codon == "CGA" or codon == "CGG":
aminoacid += "R"
elif codon == "AGU" or codon == "AGC":
aminoacid += "S"
elif codon == "AGA" or codon == "AGG":
aminoacid += "R"
elif codon == "GGU" or codon == "GGC" or codon == "GGA" or codon == "GGG":
aminoacid += "G"
elif codon == "AUG":
aminoacid += "M"
elif codon == "UAA" or codon == "UGA" or codon == "UAG":
aminoacid += "X"
#終止コドンは便宜的にXとしています。
return aminoacid
(3)処理の実行
下準備が終わったので処理を実行していきます。
proteinにアミノ酸配列を代入する操作を100回行い、100回目にproteinをターミナルに出力します。
for n in range(100) :
protein = ""
for i in range(round(len(seq_mRNA)/3)):
codon = seq_mRNA[3*i] + seq_mRNA[3*i+1] +seq_mRNA[3*i+2]
protein += codon_2_aminoacid(codon)
print(protein)
Biopythonの場合
次にBiopythonを用いて、同様のターゲット配列に対して転写翻訳を行います。
from Bio.Seq import Seq, transcribe
from seq import seq as seq_DNA
#配列を読み込みます。
(1)転写および翻訳
biopythonでは一旦転写をせずにいきなり翻訳することができますが、便宜的に転写後の配列をseq_transcribedに代入しています。
for i in range(100):
seq = Seq(seq_DNA)
seq_transcribed = seq.transcribe()
seq_translated = seq.translate()
print(seq_translated)
biopythonを使うと塩基配列の操作が数行のコードで終わるため、かなり便利です。
以上で両者の処理時間を比較する用意ができました。
処理時間の比較結果
処理時間の比較結果
正確さを出すために、10回行った平均をTnとしています。
biopythonを使用する方が圧倒的に早いですね。
しかし数秒単位では待ち時間にも差がなくそこまで気にならないので、もう少し深追いしてみようと思います。
処理回数を100回から10000回まで段階的に増やし、それぞれの処理回数に対するT1/T2を比較してみます。
なお、それぞれの処理回数に対して、先ほどと同様に10回ずつ計測を行いその平均を取りました。
処理回数が多くなるにつれて、若干差が広がってきていますが、これは多分キャッシュが増えていくからだと思っています。
5000回と1000回の部分が逆転している理由はわかりませんが、結局biopythonの方が圧倒的に高速だということがわかりました。