您現在的位置:
  1. 行業動態 - 行業動態

忘了Python和Fortran吧,科學家開始用Julia了 2019-12-17 16:33:46



研究者常常面臨著使用一種編程語言來寫代碼,之后再用一種更快的語言重寫的窘境。一種新的編程語言可以解決這個難題。

在做氣象建模的時候,每秒的計算時間都很重要。這些模型中需要考慮到空氣、土地、太陽和海洋,以及它們之間復雜的物理聯系。一個模型可能會有數百萬行代碼,在世界上最強大的計算機上執行。因此,氣候建模聯盟(CliMA)——美國的一批科學家、工程師和數學家組成的聯盟——的氣候學家在從零開始為模型寫代碼的時候,就選擇了一種能滿足他們需求的語言:Julia。

Julia于2012年發布。這是一種開源的語言,將腳本語言(例如Python,Matlab和R)的交互性和語法與編譯語言(例如Fortran和C)的速度結合到了一起。

 

在氣候科學家里,通用語是Fortran:快速,但是——由于它的歷史可以追溯到1950年——并不是很吸引人。美國海軍研究生院的數學家,也是CliMA的主管之一Frank Giraldo說:“很多人聽到Fortran的時候就一臉‘天啊,我可不想寫那玩意兒’的表情。”年輕的程序員更喜歡那些可以使用最時髦的軟硬件設計模式的編程語言,他說,而自從使用了Julia,他看到大家的興趣越來越濃。“有些人是真的對氣候模型感興趣,其他人的興趣則在用Julia做大規模應用上。”他說。

 

正在加州理工大學學習材料科學的Jane Herriman說,自從她用Julia重寫了自己的Python程序之后,運算速度提升了十倍。墨爾本大學的系統生物學家,自稱“Julia傳教士”的Michael Stumpf將R語言的模型以Julia重寫,運算速度提升了800倍。“以前要跑好幾周甚至幾個月,現在一小時就跑完了。”他說。

 

性能的大幅提升,加上Julia親民的語法和解決“語言轉換”問題的承諾(研究者們通常需要用Python這類用戶友好的語言寫代碼原型,之后再用一種更快的語言重寫),讓這種編程語言名聲鵲起,特別是在計算量較高的領域里。除了氣候模型之外,人工智能、金融和生物信息這些學科也開始改用了它。

 

根據麻省理工學院的計算機科學家,也是Julia的創始人之一Alan Edelman的說法,Julia至今已經有900萬下載量了。一份數據顯示,它已經進入了全世界最流行的編程語言前50名。雖然還是較為小眾——2019年Julia排行第50,而Python是第3——但它有著熱情的用戶群體。

 

“大家對重寫代碼已經厭煩了。”Edelman說,“需要寫不明所以的代碼很煩,別人或是研究生或是同事寫完代碼就換工作留下一大堆不知道該怎么處理的代碼很煩。正是這些人改用了Julia——他們想要性能、可移植性和靈活性。”

Julia——它和Python、R一起構成了數據科學家們所喜愛的交互式計算文檔系統“Jupyter”——本質上是一種披著腳本語言皮的編譯語言。在Python這樣的腳本語言中,用戶往一個可交互的編輯器里面一行一行敲代碼,然后就會直接解釋執行,并立刻返回結果。在C和Fortran這樣的語言里,代碼必須先編譯成為機器可讀的指令,然后才能執行。前者更容易使用,而后者的代碼執行速度更快。因此,如果執行速度比較重要的話,程序員就常常需要先用腳本語言開發算法,再翻譯成C或者Fortran。這種流程相當繁瑣,且容易出錯。

 

Julia避免了這個“語言轉換”問題,因為它執行原理和C類似,而語法則和Python類似。它還包含了一些內建特性,用來加速對計算量要求較高的問題,例如分布式計算(即允許程序員將困難的問題分拆到多個處理器或計算機來解決的功能)。倘若沒有Julia,這可能需要用多種語言才能寫成。馬里蘭大學的量化臨床藥學家Vijay Ivaturi用Julia寫了一個工具,用來輔助自己決定藥品劑量。他之前所使用的語言Fortran則必須使用好幾種輔助工具。“我愛上了Julia的速度,”他說,“但最重要的是,我覺得我愛上的是不需要換幾種語言就能干完活:從頭到尾,我只需要一個開發環境就行了。”

 

用戶在Julia里寫代碼通常會使用REPL(讀取-求值-輸出循環)界面。這是一個交互性的文字界面,讀取輸入,求值,然后將結果輸出給用戶。(也可以使用標準的編程用文字編輯器,或是Jupyter Notebook。)在表面上,Julia和Python是完全一樣的:輸入一行命令,看到結果。但是在背景里,語句經過了編譯。因此,第一次寫下一個函數的時候,運行起來可能會慢,但是接下來再運行就快了。一旦代碼能夠正確運行之后,用戶就可以進一步優化它(見“開始使用”)。

 

 

開始使用

搭建環境
  • Julia: julialang.org
  • Juno,一個免費的Julia語言“集成開發環境”,其中包括代碼編輯器,調試工具和交互界面:junolab.org
  • 調試器:go.nature.com/2jdfr5g
  • IJulia,使用Jupyter寫Julia代碼的內核: go.nature.com/2jldaj2
  • 擴展包:go.nature.com/30brtxe
使用指南
  • julialang.org/learning/
  • Julia語言文檔:go.nature.com/2nxrqup
  • Julia的思考方式:go.nature.com/2y7skii
 
獲取幫助
  • Slack: julialang.slack.com
  • Discourse: discourse.julialang.org
  • Gitter: gitter.im/JuliaLang/julia
  • 一個可交互執行的Julia文檔,包括一些關鍵特性:go.nature.com/2lxllfd
     

 

根據Giraldo的說法,CliMA為他們的項目選擇Julia的一個理由是一次圣誕節的編程競賽上Julia的出色表現。當時Julia與C和Fortran正面對決,Giraldo作為小白鼠上場了——當時他還是Julia新手。“直接用Julia寫出來的代碼就只比高度優化過的Fortran代碼慢幾個百分點。”

 

而且更加可讀,他補充說。由于Julia有著多重派發(允許不同函數使用相同的函數名)和元編程(允許程序修改自身)等特性,因此十分簡潔Julia還支持Unicode符號,因此程序員可以使用希臘字母做變量名,而不一定必須使用拉丁字母轉寫。也就是說,他們可以寫出和論文里的數學公式一樣的代碼,例如計算圓周率時使用C = 2*π*r而不是C = 2*pi*r。“你可以把腦子里想到的東西直接寫下來。”Edelman說,“最好是讓機器遷就你,而不是你遷就機器。”

哥本哈根大學生物多樣性的研究者Michael Borregaard說,和R相比Julia讓他的代碼快了兩個數量級——計算速度和程序清晰度上都有受益。“寫Julia讓我能夠更簡單地優化速度,或是重新思考實現方式,讓它變得更快。”他說。

 

對羅德島婦女嬰兒醫院的臨床研究助理George Tollefson來說,Julia對用戶友好和計算效率的兼重讓它成為了編寫大型基因組數據集的數據界面的理想語言。“Julia最開始就很有吸引力,因為它又快又強大。”他說,“但是寫起來卻十分簡單。”而且它還有一個樂于助人的社群,Tollefson補充道。因為這種語言的用戶群體比較小,因此想要在網上找到答案可能會有困難。但是Slack、Discourse和Github上的開發者社群可以彌補這個缺憾。“有時我們發現別人沒有遇到過[和我們一樣的]問題,但是他們半小時內就能幫我們解決。”Stumpf說。

 

但是,用戶群小也意味著擴展包比較少——擴展包是程序員在新的領域使用一門語言時所使用的外部代碼庫。Edelman說,Julia的生態系統有不到2600個擴展包,其中包括Flux(機器學習),BioJulia(DNA測序分析)、DifferentialEquations(計算模擬)和JuMP(數學建模)。相比而言,CRAN R語言庫有超過14000個擴展包,而Python的PyPI里有超過187000個擴展包。

 

如果研究者需要一個沒有轉寫進Julia的代碼庫,可以使用Pycall(對應Python)或Rcall(對應R)這樣的插件來直接使用代碼。哈佛大學計算機系研究生Lydia Krasilnikova此前在麻省理工學院讀本科的時候寫了一個Matlab到Julia的翻譯器,可以在網上找到。“很多人給我發信說這個翻譯器簡化了他們轉換的過程,并允許他們在Julia中測試代碼,然后修改原有的代碼庫。這是他們以前做不到的。”她說。

 

說到底,編程語言的選擇還是要看個人偏好、項目需求和同事。很多情況下,任何編程語言都能用。但要是想用“高效的代碼”,Giraldo說:“那么,說實話,我現在覺得Julia就是最好的選項了。悶頭研究一下就好。其實一點也不難。

 

原文以 Julia: come for the syntax, stay for the speed為標題
發布在 2019年 7月 30日《自然》工具箱上

轉自Nature自然科研公眾號



[返回]


上一篇Facebook的非植入式腦機接口,看穿你的心

下一篇沒有了

cf手游无影套装图片 熊猫配资 淡水酒店一条龙服务 海立配资 呼和浩特小姐妓女 澳洲幸运8 巨款大冲击 麻将赌博手法 黑龙江省22选5最新开奖结果 三级片咪神陈静甩巨乳砸碎西瓜 pk10开奖 日本av女优成人做爱网站 浙江6加1开奖走势图 打红中麻将必摸技巧 五分十一选五APP最新版下载 足球比分直播500竞彩推荐完整版 澳洲幸运10网站