在生物信息學領域,Python 和 Perl 誰更強大、易用、代表著未來的發展方向?
瀉藥。
- 首先我個人的主張是:python !
- 3年的生物信息應用開發和數據分析實踐經歷表明,我選擇Python並在期間推薦周圍的同事和朋友也嘗試和選擇python,是非常有益效率的,至少明顯克服了以前perl的部分弊端。
- 空洞的語言之爭在程序猿本是一個有違職業操守的行為,但放到某一個特殊場景也許有益新手也引發他人思考。 對生物信息而言,語言其實是一個次要問題,最重要的是建模和求解,而非工具選擇;何況有些時候在使用別人的程序時是無法選擇語言的。
- 談點具體的:python代碼本身比perl更易學易讀易懂,這點基本沒太大爭議;而對於非一次性程序,尤其是pipeline類的,對「易改」有更高的要求,我們很不希望一個冗長的perl腳本在三個月後就看不懂。。。還有那些怪異符號對人的震懾感 &>=&< 另一個方面,因為歷史原因,以前積累的生物信息學資料庫和開源程序/公開程序(因為某些原因,大家只是共享自己的程序,沒有任何開源許可)大部分是perl構建,而後人為了學習和重現也繼續學習perl;但實際上這不是必要的,不需要為此而讓自己也使用perl,可實踐中人們精力有限,學一門語言總比學兩門輕鬆。
- 對於 bioXXX方面,其實大同小異,只是社區活躍度有所不同。至少我所見過和使用過的很多程序以及分析流程中,perl主要用於小腳本,python經常用於pipeline串聯和某些分析方法實現等,R主要是統計和結果可視化(有 bioconductor),至於SVG的輸出,則基本是語言無關的,看各自的喜好了。另一些web類的工具,或者workbench等,則基於java構建的也不在少數,比如solid的部分工具,CLC workbench,貌似是SWT ?等等。甚至Broad的IGV瀏覽器採用了java web start這種技術(較少見),或許它可以在下個版本考慮javaFX ?!
綜上,perl和python各有自己的優缺點,為了學習和重現前人的成果,學習perl無可厚非;為了自己在實踐中開發和分析數據,優先推薦python。
順便推薦點老外們的討論供參考:
- http://biostar.stackexchange.com/questions/2742/perl-or-python-for-comparative-genomics
- http://network.nature.com/groups/bioinformatics/forum/topics/1611
- http://www.quora.com/Bioinformatics/How-did-Perl-start-off-as-the-dominant-language-in-bioinformatics
作為使用過兩種語言的我來說,python確實是寫腳本程序的首選,優美而易懂。但是一個讓我始終放不下perl的原因是它強大的處理文本的能力,因為絕大多數生物信息分析工作都是各種格式轉換和文本處理,perl能強大到用一行命令完成python幾十行腳本的任務,而且它和寫shell命令行差不多,但可以比shell命令行更出色,另外因為這些處理任務的程序一般只用一次,所以沒有維護不維護的問題,但用perl寫起來非常省時省力。所以一般寫大型程序我會用python,其它文本處理任務用perl。下面是一個不錯的教程教授perl單行命令,學會受益匪淺。http://www.catonmat.net/blog/introduction-to-perl-one-liners/自己開發了一個perl的包,方便各種一行代碼使用,歡迎指正:https://github.com/kepbod/pl
我傾向是最好都能看懂,開發工具方面python優於perl,而用寫簡單腳本處理日常文本的話perl/shell更輕便,統計、作圖的話用R。所以我的工作一般是這樣,寫流程用shell,如果寫一個別人也需要用的軟體用python,處理各種奇怪軟體生成的奇奇怪怪結構的結果生成賞心悅目的數據表用perl,有了非常organized數據表以後丟進R做儲存、統計和作圖
其實perl和python基本上都有非常對應的功能,基本上可以說哪個用著順手用哪個就可以。但是用python開發工具的主要原因是:
- perl的寫法過於靈活。有人寫的像C一樣死板,有人寫的像天書——比如一行莫名其妙的標點符號,而且每個人自己對perl寫法也會時常發生「技術爆炸」式的突變和「阿爾茲海默式」的衰退。「卧草還可以這麼寫好屌」「卧草我這寫的是什麼現在已經完全不記得了」。別人寫的perl你看不懂,你寫的perl別人看不懂,你自己寫的perl過倆月你自己也看不懂了——對於perl,「看懂自己寫的代碼的概率」和「代碼寫好至今的時間」存在負相關,所以維護想起來比較麻煩,有時甚至覺得還不如徹底重寫。所以用作開發時,不是很推薦。
- python有更加強大的擴展性。scipy numpy Matplotlib這些非常牛逼的包允許你在python里幹完幾乎所有perl、R、matlab能幹的事兒(當然沒有R這麼簡單容易),還能替代php做web開發。所以當一個開發工作需要牽扯到盡量少的語言的時候,python是個遠好於perl的選項。
python對於新手的缺點是:
- python2和python3是兩種語言 ## 其實沒那麼大差別啦,不過日常用法主要就是print變了,導致舊代碼未必跑得通
- 自備遊標卡尺 ## 大霧
- 裝module裝得有時候挺噁心的,還經常有字符集的問題 ## 可用aconda,但是開始的時候我是用pip的然後又混用aconda就有點麻煩了,但無論如何其實還是比perl的cpan強太多
相比之下,perl做一些輕量級腳本處理的工作優點是:
- 無比強大且易用的正則表達式。python的正則表達式一樣強大,尤其是抓網頁很好用,但是用起來要麻煩多了
- 單行腳本狂拽酷炫吊炸天,非常適合插在pipeline里,一行幹掉python幾十行
- 寫起來不像awk什麼的讓人處心積慮掉頭髮,不熟練的時候強行把c一樣的代碼寫在一行里也是可以的
- 輸入輸出文件IO要簡單省事得多,堪比shell,遠方便於python
- 數據結構靈活。hash套hash,hash套array,hash的key套array,hash套hash套hash,非常實用。而且不同數據類型帶符號標誌,比較好區分
缺點是:
- 草書容易看不懂
- 非root許可權裝包稍微麻煩一點,cpan實在差評
- 面向對象比較弱而且代碼看起來有點噁心
- 評論thomasz『連Google搜索怪符號怎麼用都搜不出來,導致Perl玩家越來越少了』,一個真實的故事……
另外建議做統計和圖的時候,不想找虐還是優先使用R而不要跟python那些強大但是蛋疼的module摩擦……當然熟練使用的話還是哪個順手用哪個
另PS,如果你想轉行做CS或者金融,python顯然是好選項……R也是很易用且應用廣泛的……perl的門路就比較窄了
贊同語言本身沒有強弱之分,但總體來說python更強大,一方面有google在支持,使用的人多更活躍,另一方面python功能更豐富,可以做文本處理、統計分析,甚至作圖,學一門就可以了,對於perl主要只能做文本處理,統計和作圖還得再學R。
Perl的介面就是一坨巨大的shi:它強迫你用PerlXS這種shi一樣的語言寫介面,而且API的命名也是一坨shi。
隨便看了下Python的介面寫法,好像要乾淨得多。===================
最近為了學習Python,用Python寫了一個簡單的代碼生成器。感覺Python在構建日常腳本方面,與Perl相比還是有很多不方便的地方:- labmda里只能有一個語句。對於稍微麻煩一點(但卻沒有那麼麻煩)的排序、映射,就得單開函數,而不能直接放在此處。
- 正則表達式不如Perl易用。比如Perl可以簡單地寫成:
$foo =~ /Some(Reg)Exp/ or die "failed to parse foo for XXX";
my $wanted_part = $1;
- 函數必須位於使用處之前。這樣一來,如果函數使用了全局變數,那就會出現腳本的頭部交錯一堆全局變數與函數,很混亂。我寫在使用Perl寫日常腳本的時候,就可以把全局變數都塞在前面,一目了然。後面接主要邏輯,然後把函數都統一放在最後面。
- 變數需要顯式地cast類型。這對於大項目比較好,但對於日常腳本是很麻煩且通常無必要的。
- Python的數據結構,相當於Perl的數據結構引用。Perl數據結構的裸奔語義設計,在編寫日常腳本時要方便得多,比如:
my %kv = map {"key$_", $_} sort @data1, @data2;
此處的兩個array會在原地拼接。同時hash table可以承接裸奔array。
- Python的變數不帶標($、%、@),格式化輸出總得用"template" % (values)語義,沒有Perl那麼簡便。
關於PERL和PYTHON之爭,歷史悠久。這裡貼一下,看看我收集的,大家是怎麼說的
關於生物信息的perl和Python的比較和爭論由來已久,這裡我僅給出幾個鏈接:
做生物信息學:Python還是Perl?
功能強大而又簡單易學的編程語言Python_有個博客請高手指點:生物信息學應用,學perl還是學python更好?為學生物信息的推薦Python2013年我在China Unix 論壇的PERL和Python版,做了個對這個問題的調查,現在還有很多人參與,到2014底約200+150人參加,大家也可以參考一下:
Perl對Python 使用調查-Python-ChinaUnix.net Python版
Perl對Python 使用調查-Perl-ChinaUnix.net Perl版
————————————————————————————————————————
再增加我為譯作《Python生物信息數據管理》中譯者序中的一段話
「我從事生物信息工作以來,編程語言開始一直以PERL和C為主,從2007年開始使用Python,初時也因為塊縮進的問題不習慣,但很快被其可讀性和開放性所吸引,喜歡上了這門語言,並作為最主要的腳本語言使用至今。回國後,發現國內大部分的生物信息工作者還是以PERL作為主要的工作語言,就想為Python在這個領域的推廣做些工作,有幸得到出版社馬嵐老師的推薦,見到本書,就與陳一情,李少娟合作進行了翻譯。
正如書中所說,編程就像寫菜譜做飯或者是按流程做生物實驗一樣,不是一件很難的事情。對於有過邏輯訓練的生物研究者只要能熟悉了編程的思想,掌握這項技能是容易的。但是如何選擇一個切門點和提高途徑,真正把它運用到自己的工作中就是另外一件事情,為什麼推薦這本Python書作為生物信息數據管理編程的入門書呢?
Python語言提供了從入門到高手的良好的學習曲線。Python語言是至今為止最接近自然語言的編程語言,學過其它一些編程語言的學員甚至不需要太多的訓練就能讀寫其代碼;模塊化和面向對象的支持使得學員能不費力地從一個只能寫幾行代碼的操作員變成一個管理千行代碼的程序員,同時書寫良好可讀性代碼的編程習慣也會令其受益終生;豐富的標準庫和第三方包使得Python語言成為當前最好的「膠水語言」,把多方資源整合到一起來解決工作中的問題。
本書的風格非常適合對編程的初學者。它從生物數據管理分析實踐出發,由淺入深地介紹編程的基礎知識,特別是對錯誤處理和程序調試等初學者常見的問題做了精闢的闡述;本書在內容上對生物信息中的經常遇到的數據整理和做圖分析有較重的篇幅,還包含了大量的Python第三方工具庫介面充分地體現了Python開放性「膠水語言」的特點。該書採用章節的篇幅都不長,每每切中要點,便於讀者圍繞主題、消化概念,且後面的練習難度適中,所以很適合作為本科生或是研究生低年級的教材;書後的編程秘訣對於進入科研實踐的研究者也有頗多的參考價值。"
—————————————————————————————————————
舊作《為生物信息學的Python教程》的譯後感
「我接觸Python是在讀博士後的實驗室之後,之前用了六年的perl和C。新的實驗室的氛圍是用Python,所以就下決心轉了過來的。最初用Python,它的強制縮進讓我用起來很不舒服,有一種拘束感,這或許是用perl習慣的原因吧;但是,經過了更長時間的使用後,特別是現在,發現三年前寫的代碼,現在重新啟用,還能看得很清楚,確實讓人覺得很爽的。這在用perl時,是沒有過的。
Python在生物信息中有很好的應用,正如我在ChinaUnix論壇的討論中提到的:
「 1,Python的學習曲線很好。對於沒有接觸編程的人能很快上手,對有編程經驗的人更是容易寫。
Python代碼的閱讀性好,學習別人寫的Python,像在讀一本小說一樣流暢,這一點是別的語言比不了的。2,Python的數據結構特別適合生物信息。比如Python的序列用於生物序列的分析是得天獨厚的,其字典功能的強大更不用說了。Python的面向對象很好,能很容易把生物信息學中的數據對象化。3,Python有諸多的軟體包支持,擴展性很好。除了有廣泛的計算機科學的軟體支持外,生物信息學中需要的許多模塊有Biopython,pygr支持,還有matplotlib,networkx,scipy等科學計算、研究中強大的軟體包支持,python是一種很好的膠水語言,與R有rpy的介面,能提供很好的統計學支持。4,Python同樣支持正則表達式,使得它在文本處理方面,能力不比perl差。」學會 Python, 看懂 Perl
我以前也是學的 Perl, 但是用了 Python之後,確實感覺更優雅,Perl 里那些奇怪的符合用多了很彆扭
而且如果是做人方向的話,生物信息未來也一定要跟人工只能結合,幾個人工只能的框架都是用Python寫的
Perl 至少要看得懂,畢竟大量工具是用 Perl開發的,要能讀懂源代碼
Python
二十年前可能是Perl的天下,現在Perl則早已被Python遠遠甩在身後了。不是只有生物信息領域,總體上就是這個樣子。
Perl搞個Perl 6,且不說搞多久了,看看搞到現在,好不容易發布的東西能幹嘛?自己整死自己。perl和Python和生信關係都不大~ 也沒有優劣之分~ 因為可以跳過perl和Python的學習,直接應用Bioperl和BioPython~ doge~ 再者,等到語言被淘汰,我們也老啦~ awk多麼老啊,現在不是一直很強大易用~ 生信那麼多文本,你難道要用Java去處理。。。有時候簡單不代表淘汰,反而在特定的情況意味著強大~ 對於未來發展來說~ Github~ 上面有最先潮的一切~
用perl 做生信快10年了,至今沒有發現有什麼地方非換成python不可的,語言就是個工具,在於你運用,就像用PC還是MAC,熟練程度不同而已
Python大法吼
結構明了,debug清晰,而且模塊好用,文檔相對詳細(點名批評R),效率很高(R,沒錯還是你),提升空間很大(Cython、pypy),生物類的模塊什麼biopython、pysam都很好用而且有人在更新維護。
什麼遊標卡尺。。能寫幾個函數的東西哪用擠一塊。。
寫perl一時爽,debug火葬場;過幾年回來看腳本的時候,python依然那麼友好。。。python吧,不僅可以做實驗,還可以直接出工業級代碼,biopython就不錯
語言是沒有強弱的,不過Python可用的開源包以及更新頻率可能要略快於Perl。另外我個人認為Python學習曲線比較平緩。至少我接觸了好多年Perl,現在依然寫不出來。。。大牛門可以拍了。
學python以後不幹這一行了 轉行也方便 網站架構 數據分析 軟體開發什麼的 都行perl基本上只能弔死在在生信這棵樹上了
最好兩個都會吧,方式差不多(循環,判斷),個人感覺perl用正則更方便(小規模腳本),尤其是匿名哈系和數組時(哈系套哈系:$h{$class}{$name}{$course}=89),python適合工程,強制所有人用一套語法,其他人容易看得懂,貌似有些軟體包只有python的
要利用降級論的眼光看待這個誰能代表方向的問題,各大名家都說過「編程語言只是工具」,兄弟記住,真的只是工具啊,未來方向不是誰能代表的,充其量說以後這個方向哪個語言用的人比較多用的比較順手罷了,歸根結底是用工具產出的那個東西,那個方向的產品才是核心點。
至於你問的估計是哪個語言更適合於開發未來這個方向的產品。那是產品決定的。
都學比較好吧,除非以後哪個把對方的優點全部吸收了,那就可以不用都學了。
學過Perl並經常使用perl的人,對我來講,學Python總感覺很痛苦。
雖然沒接觸過perl,好像輪不到我來討論,對個體來說,哪個方向的開源比較強就用哪個。
推薦閱讀:
※剛接觸生物信息二代測序數據分析,看文獻學軟體學語言,如何不著急?
※如何理解基因富集分析以及富集的意思?
※為什麼只有猿誕生了智慧,而獅子、老虎等卻只有力量這個屬性?
※基因是否會因外部因素而進行修正?