整数の文字列を文字列としてエンコードするファイル形式(fastq形式)があります。各整数は、オフセット付きのASCIIコードで表されます。残念ながら、一般的に使用されているエンコーディングは2つあります。1つはオフセットが33で、もう1つはオフセットが64です。通常、1つのオフセットから別のオフセットに変換する長さ80〜150の文字列が1億個あります。この種のことを行うために私が思いつくことができる最も単純なコードは次のとおりです。
def phred64ToStdqual(qualin):
return(''.join([chr(ord(x)-31) for x in qualin]))
これは問題なく機能しますが、特に高速ではありません。100万本の弦の場合、私のマシンでは約4秒かかります。いくつかのdictを使用して翻訳を行うように変更すると、これを約2秒に短縮できます。
ctoi = {}
itoc = {}
for i in xrange(127):
itoc[i]=chr(i)
ctoi[chr(i)]=i
def phred64ToStdqual2(qualin):
return(''.join([itoc[ctoi[x]-31] for x in qualin]))
やみくもにcythonの下を走ると、1秒弱になります。
経営幹部レベルのように見えますが、これは単にintにキャストし、減算してから、charにキャストするだけです。私はこれを書いていませんが、かなり速いと思います。これをPythonまたはcythonバージョンでより適切にコーディングする方法を含むヒントは、非常に役立ちます。
ありがとう、
ショーン