はじめに
pythonでDNAを相補配列に変換する関数を作ってみます。4通り作ってみてどれが早いか比較してみます。
相補鎖にするということ
AはTに、CはGに、GはCに、TはAに変換します。その上で並び方を逆にします。
ACGTTTTTの相補配列はAAAAACGTです。
ACGT以外もある
RはAまたはGのことです。YはCまたはTのことです。DはC以外(つまりAかGかT)。大文字と小文字もあります。
DNA配列の長さは例えば10 Mb(1000万塩基)などです。
辞書
置き換え方法を指定する辞書を作ります。
compDic = {"R":"Y","M":"K","W":"W","S":"S","Y":"R","K":"M","H":"D","B":"V","D":"H","V":"B","N":"N","A":"T","C":"G","G":"C","T":"A","r":"y","m":"k","w":"w","s":"s","y":"r","k":"m","h":"d","b":"v","d":"h","v":"b","n":"n","a":"t","c":"g","g":"c","t":"a"}
いろいろ作ってみる
1番目のやり方:
相補配列をしまう空のリスト(大きさはDNA配列の長さと同じ)を作って、DNA配列を最初から読んで、相補配列をリスト最後尾から1文字ずつ入れていく。最後にjoin()で繋げる。
def comp1(dna):
l = len(dna)
c = ["" for num in range(l)]
index = l-1
for i in dna:
c[index] = compDic[i]
index -= 1
return ''.join(c)
2番目のやり方:
空のリストを作る。DNA配列を前から1つずつ読んで、その相補塩基をinsert()でリスト先頭に追加する。
def comp2(dna):
l = len(dna)
c = []
for i in dna:
c.insert(0,(compDic[i]))
return ''.join(c)
3番目のやり方:
空のリストを作る。DNA配列を後ろから1つずつ読んで、その相補塩基をappend()でリスト最後尾に追加する。
def comp3(dna):
l = len(dna)
c = []
for i in range(l):
c.append(compDic[dna[l-i-1]])
return ''.join(c)
4番目のやり方:
空の文字列を作る。DNA配列を後ろから1つずつ読んで、その相補塩基を文字列に追加する。
def comp4(dna):
l = len(dna)
str = ""
for i in range(l):
str += compDic[dna[l-i-1]]
return str
かかる時間を計ってみる
おおよそ500万塩基のDNA配列をファイルから読み込んで、上記4つの関数で相補鎖にしてみました。コードは@fantm21さんのものです。ありがたく流用させていただきました。
start = time.time()
comp1(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
start = time.time()
comp2(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
start = time.time()
comp3(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
start = time.time()
comp4(sequence)
elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
結果
以下のようになりました。comp2は終わりませんでした。
elapsed_time:1.2188289165496826[sec]#comp1()
elapsed_time:1.3529019355773926[sec]#comp3()
elapsed_time:1.5209426879882812[sec]#comp4()
終わりに
あらかじめ必要なサイズの空のリストを作って、ここに相補配列を入れていくのが速いようでした。まあこのくらいの時間なら良いかもしれません。
もっと速い方法をご存知の方がいましたら、ご教示いただけますと幸いです。