0
0

More than 3 years have passed since last update.

DNA配列を相補鎖にするpythonコード どのやり方が速いのだろう?

Posted at

はじめに

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()

終わりに

あらかじめ必要なサイズの空のリストを作って、ここに相補配列を入れていくのが速いようでした。まあこのくらいの時間なら良いかもしれません。
もっと速い方法をご存知の方がいましたら、ご教示いただけますと幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0