越來越多的 Python 開發者加入 Rust 隊伍!

2024年2月6日 19点热度 0人点赞

未來我們將看到更多以Python作為前端(提高編程效率)並以Rust作為後端(為了性能)的庫。

原文鏈接:
https://baincapitalventures.com/insight/why-more-python-developers-are-using-rust-for-building-libraries/

Python

Rust正在取代C成為高性能Python軟件包的“後端”工作語言。原因是什麼呢?

首先,我們來看看動機問題,Python編寫起來很方便,但運行速度慢。Python的速度實在太慢了,以至於你無法使用純Python編寫高性能庫,尤其是無法編寫數據處理庫。然而,Python是機器學習和數據工程的主導語言。因此,如果你想為數據工程師、機器學習工程師等編寫庫,就會遇到以下問題:

  • 你需要使用Python編寫API,但是你不能使用Python完成高性能的數據處理工作。

這意味著,如果你想編寫庫就必須:

  • 學習使用C編程,或祈禱有人學習使用C編程,並編寫一個庫,而你可以依賴這些庫來實現底層的操作。

熟悉C語言的人可能會問,這有什麼不好嗎?也許大多數庫的作者都可以將數值計算外包給NumPy或SciPy。而在確實需要時,他們也可以學一點C。

然而,情況並不是那麼理想。盡管將一些任務外包給NumPy、SciPy等庫確實很方便,但我們不得不向量化每個函數,而且還不能使用for循環寫代碼,這很痛苦。擔心某些操作會被全局解釋器鎖(GIL)阻塞也很令人頭疼,還有其他各種問題。並非你想做的一切都能輕松地找到現有庫。

那麼,還有一種辦法,為什麼不從頭開始用C編寫庫,並加上一些Python綁定呢?問題在於,如果你有Python背景,那麼使用C編程對你來說會顯得非常底層,學習這種語言需要花費一些功夫。空指針解引用、緩沖區溢出、內存泄漏……這些都是使用C語言時可能遇到的陷阱,這些對於一開始就學Python程序員來說都是陌生的。

如果有更好的辦法;如果有一種語言速度和內存效率與C語言相當,但不需要手動內存管理或垃圾回收;如果這種語言擁有出色的Python工具支持和一個蓬勃發展的開發者社區,那該多好啊。

Rust

Rust的速度很快,且內存管理高效。因此,並行和並發編程更加容易。Rust具有出色的工具和友好的編譯器,擁有一個龐大而活躍的開發者社區。Rust可以讓程序加快運行速度,跳得更高,而且還能在學習中交到更多朋友。

最重要的是,對於Python開發者來說,學習Rust比學習C更容易。

“第一層”體驗更好,因為新手更容易使用Rust編寫“安全”代碼。學習曲線更平滑,可以隨著時間的推移逐漸掌握更高級的語言特性。

因此,在過去的幾年裡,我們看到一些以Python作為前端的高性能庫選擇Rust作為後端。例如:

  1. Polars

這是一個用於處理數據框的、快速、高度並行、內存高效的庫。olars的作者Ritchie Vink考慮了幾種不同的語言,最終選擇了Rust。以下是Ritchie認為Rust具有的優勢。

“我認為,數據工程/科學將繼續由連接低級編譯二進制文件的高級語言主導。該主機語言的多線程和性能並不重要,因為這些工作將傳遞給下遊的工具。

因此,我們會選擇C、C 、Rust、Zig或Fortran。

Zig還很年輕,但它可能會成為新的C。

在我看來,Rust已做好準備成為新的C 。

在這些語言中,Rust具有最好的工具支持(也許將來Zig也可以)……

借用檢查器能夠保證內存的安全使用和安全的並發。加上出色的工具(crates.io、pyo3),使其成為構建低級工具的最佳語言。

由於默認是安全的,新手也可以輕松地構建工具並逐步學習。如今就是這種情況,許多Python用戶在編寫Rust,不僅可以順利完成工作,而且性能提升也很滿意。

簡而言之,我認為Rust具有最佳正確性保證,並且是一種現代系統語言。”

  1. Lance

這是一款高性能、低成本的矢量數據庫。創始人Chang She和Lei Xu最初使用C 編寫了代碼庫,後來決定切換到Rust,盡管他們擁有豐富的C開發經驗。Chang做這個決定的理由如下:

“對我們來說,從C 切換到Rust的決定主要是因為我們可以更有效率地工作,不會失去性能,而且不用再處理CMake。我們基本上是從零開始學習Rust,在學習的同時,Lei和我在大約三周的時間裡用Rust重新編寫了Lance(替換了大約四個月的C 代碼)。此外,每次發佈使用Rust編寫的新功能時,我們更有信心,不用擔心在執行每個其他命令時引發段錯誤。”

Rust不僅適用於數據處理,而且也可作為許多其他具有高性能要求的Python軟件包的後端。

  1. Ruff

Ruff是一個用Rust編寫的、速度非常快的Python代碼檢查工具。以下是Ruff的創作者和Astral創始人Charlie Marsh闡述的關於在Python生態系統中使用Rust取得成功的原因。

“作為系統編程的新手,Rust提高了我構建軟件的能力。作為一門語言,Rust會讓你(或者說是強迫你)關註編寫高性能代碼的重要細節:何處以及何時分配內存,如何在內存中佈置數據等等。高級語言會保護你免受這些細節的困擾,雖然背後的理由很充分,但對於某些類別的軟件來說,它們是構建軟件的核心。Rust能夠在不犧牲抽象的情況下,在這些較低級別上操作。”

然而,我相信Rust的許多成功來自於它的工具(Cargo)以及語言和生態系統本身的易用性。我的大部分職業生涯使用的都是Python、TypeScript和Java,Ruff是我首次嘗試從頭開始使用Rust構建的產品。Rust並不是一門易學的語言,但根據我的經驗,難度主要來自於學習新概念和新思維方式,而不是與構建問題或一些莫名其妙的錯誤做鬥爭。對於我來說,使用Rust可以進行系統編程,因此我很看好Rust作為Python和其他高級語言的補充。”

  1. Pydantic

這是一個面向開發者的Python驗證庫。Pydantic團隊使用Rust編寫了第二版,並看到性能提升了20倍,即使對於簡單的模型也是如此。除了性能之外,Rust還有其他的優點。Pydantic的創始人Samuel Colvin提到了其中一些:

“關於Rust的另一點是,不僅速度很快,而且使用Rust編寫和維護的代碼通常更容易。特別是,Rust會強制捕獲和處理每一個可能的錯誤,而Python(以及TypeScript)的類型系統會忽略這些錯誤,因此我可以調用 'foobar()',而根本不知道在什麼情況下可能引發什麼異常。基本上,我必須通過反復試驗來找出可能會失敗的地方。”

Python與Rust的結合

我們認為,未來我們將看到更多以Python作為前端(提高編程效率)並以Rust作為後端(為了性能)的庫。總的來看,如今的Python開發者在構建高性能庫方面有更好、更順暢的途徑。