06092006 perl bioinformatics Python bioperl
みんなのpythonも読んだし、フレームワークでも試してみるかと、djangoとかTurbogearsに手をだしたら、火傷した。
- http://www-06.ibm.com/jp/developerworks/linux/060802/j_l-django.shtml
- http://www-06.ibm.com/jp/developerworks/linux/060825/j_l-turbogears.shtml
djangoは一通りサンプル動作をさせることができたけど、Turbogearsはコントローラのあたりからさっぱりわからん。
いきなりフレームワークは無謀すぎたかなということで、Biopythonでも入れて、もう少しpython慣れすることに。
easy_install numpy wget http://www.egenix.com/files/python/egenix-mx-base-2.0.6.tar.gz python setup.py install svn co http://www.reportlab.co.uk/svn/public/reportlab/trunk python setup.py install wget http://biopython.org/DIST/biopython-1.42.tar.gz python setup.py install
easy_installはperlでいうところのcpanコマンドみたいで楽チンです(ちゃんと動けば)。動かないのは地味にダウンロード、展開、setup.pyを行なった。
さて、インストールも無事に終了したところで、bioperlと比べてみた。比較したのはpdbファイルの処理。というのは、FMO用のインプット作るときに使っているPDBパーザーつまりBio::Structure::IOがやたらと遅く、不満だったからというありがちな理由。
コードはこんな感じで、1fatっていうpdbファイル読み込んでCalphaを出力してみた。
python
from Bio.PDB.PDBParser import PDBParser parser=PDBParser(PERMISSIVE=1) structure=parser.get_structure("1fat", "1fat.pdb") for model in structure.get_list(): for chain in model.get_list(): for residue in chain.get_list(): if residue.has_id("CA"): ca_atom=residue["CA"] print ca_atom.get_coord()
perl
use strict; use Bio::Structure::IO; my $pdb_file = "1fat.pdb"; my $structio = Bio::Structure::IO->new(-file => "$pdb_file", -format => 'PDB'); my $struc = $structio->next_structure; for my $chain ($struc->get_chains) { for my $res ($struc->get_residues($chain)) { for my $atom ($struc->get_atoms($res)) { print join " ",$atom->xyz,"\n" if $atom->pdb_atomname eq " CA "; } } }
で、ベンチマーク
$ time python test.py real 0m1.161s user 0m0.996s sys 0m0.116s $ time perl pdbtest.pl real 0m3.183s user 0m3.056s sys 0m0.044s
平均とってないけど、何回か実行してみてもpythonのほうがbioperlよりも3倍くらい速かった。bioperlのコードってなんだかなと思うことがままある。pdb_atomnameなんかも4文字で前後にスペース入ってるし。というわけで、SBDD周りのプログラミングはbiopythonのほうが扱いやすい感じがしてる。
余談だが、Turbogears普通に触れる程度までpython覚えてやる(意地でも)とか思ったので、Dive Into Pythonも読み中。