Python要被學術圈拋棄了?科學家們可能找到了更好的替代品

一些科學家開始使用比 Python 效能更強大的新程式語言了,它和 Python 一樣能夠“立等可取”,而且計算能力還更強。

原文作者:Jeffrey M. Perkel

2015 年,生物資訊學家 Johannes K ster 還是(用他自己的話說)“差不多全職寫 Python 的”。他當時已經用 Python 寫過一個備受歡迎的工具——流程管理工具 Snakemake。

現在,他正在準備寫的專案所要求的計算能力超過了 Python 能提供的範圍。

所以他開始搜尋新的工具。

現在德國杜伊斯堡-埃森大學任職的 K ster 正在尋找一種計算機語言,

可以具備 Python 的“立等可取”性,同時擁有 C 和 C++ 這類語言的速度

。換言之,“一個高效能的語言,而且還,這麼說吧,符合人類工程學。”他解釋道。

他找到的語言就是 Rust。

Python要被學術圈拋棄了?科學家們可能找到了更好的替代品

象徵兼具速度和安全的程式設計師的漫畫。繪畫:Project Twins

Rust 是 2006 年由 Graydon Hoare 在加利福尼亞州瀏覽器公司 Mozilla 工作的時候作為小專案開發的。Rust 混合了 C++ 這類語言的效能、友好的語法、對程式碼安全性的關注和一套精心設計的工具用以簡化開發流程。Mozilla 的 Firefox 中有一部分就是用 Rust 寫的。據報道微軟也使用 Rust 重寫了 Windows 作業系統中的一部分。

每年一度的 Stack

Overflow 開發者調查已經連續五年將 Rust 列為“最受喜愛的”程式語言

。程式碼共享網站 GitHub 說,

Rust 是該平臺 2019 年增長第二快的語言,比去年增長了 235%。

科學家們同樣看向了 Rust。例如,K ster 用它寫了一個叫做 Varlociraptor 的應用。該應用能將數百萬的基因序列與幾十億種基因鹼基比對,以找出基因突變。“資料量極大,”他說,“所以比對必須儘可能地快。”但是,Rust 的強大是有代價的:

學習曲線很陡。

“上手之前是得花些時間。”賓夕法尼亞州諮詢公司 Integer 32 的創辦者,也是 Rust 核心團隊成員的 Carol Nichols 說。“但是它讓我能夠做一些此前無法做到的事。我認為這些時間花得值。”

警告:沒有護欄

分析科學資料的工作流程通常會使用 Python、R 和 Matlab 這樣的語言。這類語言會逐行解釋程式碼並執行。

該模式在探索資料的時候很有用,但是速度不會快。

C 和 C++ 很快,但是沒有“安全護欄”。斯德哥爾摩的 Rust 程式設計師(他們管自己叫Rustacean),Ashley Hauck 說。例如,沒什麼能阻止 C 和 C++ 的程式設計師訪問已經釋放回系統的記憶體,或是把同一塊記憶體釋放兩次。最好的情況下,這樣做會讓程式崩潰,但也有可能返回無意義的資料或是產生安全漏洞。根據微軟的研究,他們公司每年修補的安全漏洞中有70%都和記憶體安全有關。

記憶體規則

Rust 的模型所使用的規則將每一片記憶體都分配給了一個單一的所有者

,並限制了誰能訪問它。違反規則的程式碼根本不會有機會崩潰——它根本就無法編譯。“他們的記憶體管理系統是基於這個生命週期概念的,允許編譯器可以在編譯的時候追蹤記憶體何時分配,何時釋放,由誰持有,誰能訪問,” Rob Patro 說。他是馬里蘭大學的一位計算生物學家。“有一整類正確性問題都可以透過語言的設計方法避免。”

這套理念還會幫助保證平行計算——使用多個處理器同時進行計算的軟體——可以安全執行。例如,可以避免多個執行緒同時訪問同一份資料的可能性。

結果是,這種語言更易於維護和除錯,但是學習起來就更難了。

“其他任何一種主流語言都沒有這些概念,而它們是理解Rust程式設計方式的核心。”Nichols 說。在都柏林聖三一大學研究地理資料視覺化的 Stephan Hügel 估計,他花費了兩三個月把一個將地理空間座標轉化進另一個參照系的 Python 演算法改寫成了 Rust,執行速度快了 4 倍。加利福尼亞州的一個化學資訊學軟體公司 Metamolecular 的創辦者 Richard Apodaca 說他為熟練使用 Rust 花了六個月。

聚焦易用性

為了彌補這一問題,Rust 的開發者花功夫改進了使用者體驗,在加利福尼亞州的 Rust 開發者工具團隊的主管 Manish Goregaokar 說。例如,編譯器會返回特別有資訊量的錯誤資訊,甚至會將出錯的程式碼高亮出來,並建議如何修正。“如果你的語言想要引入新的概念,那最好用起來方便一些。” Goregaokar 解釋道。

Rust 社群還提供了詳盡的文件和線上幫助

,其中包括一本大受歡迎的線上詳解“Book”和一份介紹如何解決常見問題的“Cookbook”。Rust 工具鏈——程式設計師用來將程式碼轉化成程式的工具——很受使用者好評(見下文“大家一起氧化吧”)。“Rust 的工具和架構真的很棒。”Patro 說。相較於 C 程式設計師需要面對的很多種編譯器和輔助應用,Rust 程式設計師只需要一個叫做 Cargo 的工具就可以編譯 Rust 程式碼、執行測試、自動生成文件、將程式碼上傳到程式碼庫中,等等。它還會自動下載並安裝第三方軟體包。Cargo 的一個外掛 Clippy 可以標亮常見錯誤和“不怎麼規範”的 Rust 程式碼,Patro 評價這一特性是“絕對棒”。

大家一起氧化吧

下面以建立一個讀取GenBank檔案的程式的步驟為例,探索Rust語言的一些功能。

訪問www。rust-lang。org/learn/get-started安裝Rust

從GitHub上覆制程式碼https://github。com/jperkel/gb_read

在命令列中執行“cargo run”以下載外部依賴,並編譯程式。程式的預設設定是讀取GitHub程式碼庫中的GenBank檔案“nc_005816。gb”,但是你可以透過“cargo run ”選擇讀取其他檔案。

使用“cargo test”執行程式碼庫裡面的測試。

使用“cargo doc ——open”建立並閱讀文件。

流行的開發環境中也有 Rust 的外掛,例如微軟的 Visual Studio Code 和 JetBrains 的 IntelliJ。還有一個線上的 Rust Playground,允許實時線上實驗 Rust 程式碼。住在悉尼的 David Lattimore 在 Jupyter 計算筆記本里面建立了一個 Rust 的核心,以及一個類似於 Python 的互動式環境REPL。

Rust 程式設計師的另外一大助力是它的第三方軟體包(Rust管它叫“crate”)生態系統,目前已經有了 5 萬多個(見下文“Rust越來越火”)。軟體包封裝了例如生物資訊學(K sterd的Rust-Bio)、地理科學(Geo-Rust專案)、數學(nalgebra)等學科的演算法。不過,Nichols 說,“要是你想要的庫沒有 Rust 版本,那就是 Rust 的大劣勢了。”當然,程式設計師有時候還是可以使用 Rust 的“外部函式介面”來搭一座橋。

氧化程式碼

不論程式設計流程如何,

不可否認的一點是 Rust 非常快。

五月,馬薩諸塞州 Dana-Farber 癌症研究所的生物資訊學家 Heng Li 用一個計算生物學的任務測試了多種程式語言,其中需要讀取 570 萬條基因記錄。Rust 超越了 C 語言獲得了第一名。“如果我們想要寫一段高效能的平行計算程式,還需要速度快、佔用記憶體少,Rust 是理想的選擇。” Li 說。

加利福尼亞大學戴維斯分校的生物資訊學家 Luiz Irber 使用 Rust 重寫(用 Rust 界的俚語說叫“氧化”)了一個叫做 Sourmash 的工具——它可以進行基因搜尋和分類——以讓程式碼易於維護,使用現代的程式設計特性,並能在網頁上使用,他說。

在團隊成員 Avi Srivastava 從用 Rust 開發開源工具的加利福尼亞州生物技術公司 10x Genomics 實習歸來之後,Patro 的團隊就由研究生 Hirak Sarker 帶領,使用 Rust 寫了一個叫做 Terminus 的基因表達分析工具。“

Rust 的美妙之處在於,它讓除錯非常簡單,因為記憶體管理好太多太多了。

”現在在紐約基因組中心工作的 Srivastava 說。

對很多 Rust 程式設計師來說,這裡的“人性化”也很吸引人。

LGBT+ 社群的成員 Hauck 說 Rust 的使用者群下了功夫歡迎她。這個社群,她說,“一直以來盡力成為具有包容性的社群——例如,非常理解多元化會產生什麼影響;非常理解如何編寫並執行行為規範。”

“我之所以還在用 Rust,這可能是很重要的原因之一。” Hauck 說,“Rust 的社群實在太棒了。”

(ID:nature-portfolio)

點個“在看”,分享給更多的小夥伴