取代 C 語(yǔ)言!眾多 Python 開發(fā)者正加入 Rust 陣營(yíng)
未來(lái)將會(huì)有越來(lái)越多的庫(kù)采用 Python 作為前端(提高編程效率)和 Rust 作為后端(提升性能)的開發(fā)模式。
Rust 正在取代 C 語(yǔ)言成為高性能 Python 包的"后端"
首先,讓我們思考這種轉(zhuǎn)變的動(dòng)機(jī)。Python 編寫簡(jiǎn)單,但執(zhí)行速度慢是其主要問題。特別是在編寫數(shù)據(jù)處理庫(kù)時(shí),由于 Python 性能較低,很難用純 Python 開發(fā)高性能庫(kù)。然而,Python 是機(jī)器學(xué)習(xí)和數(shù)據(jù)工程的主要語(yǔ)言。因此,當(dāng)開發(fā)面向數(shù)據(jù)工程師或機(jī)器學(xué)習(xí)工程師的庫(kù)時(shí),我們會(huì)遇到以下問題:
雖然我們需要用 Python 編寫 API,但高性能的數(shù)據(jù)處理任務(wù)無(wú)法僅依靠 Python 完成。這意味著在編寫庫(kù)時(shí),你有以下選擇:
- 要么自己學(xué)習(xí)并使用 C 語(yǔ)言
- 要么依賴他人編寫的 C 語(yǔ)言庫(kù)來(lái)執(zhí)行底層操作
熟悉 C 語(yǔ)言的開發(fā)者可能會(huì)問:"這有什么問題嗎?許多庫(kù)作者可以將數(shù)值計(jì)算任務(wù)交給 NumPy 或 SciPy 處理。"
但實(shí)際情況并非如此理想。雖然將某些任務(wù)外包給 NumPy、SciPy 等庫(kù)很方便,但這要求所有函數(shù)都必須向量化,且不能使用 for 循環(huán)編寫代碼。此外,還需要考慮全局解釋器鎖(GIL)對(duì)某些操作的阻塞,以及其他各種問題。并非所有需求都能在現(xiàn)有庫(kù)中找到解決方案。
為什么選擇 Rust?
Rust 具有與 C 語(yǔ)言相當(dāng)?shù)乃俣群蛢?nèi)存效率,但無(wú)需手動(dòng)內(nèi)存管理或垃圾回收。它擁有出色的工具支持、友好的編譯器和不斷發(fā)展的開發(fā)者社區(qū)。使用 Rust 不僅能提升程序性能,還能在學(xué)習(xí)過程中結(jié)識(shí)更多同道中人。
最重要的是,對(duì) Python 開發(fā)者而言,Rust 比 C 語(yǔ)言更容易學(xué)習(xí):
- 改善了"入門級(jí)"體驗(yàn),使初學(xué)者更容易編寫"安全"的代碼
- 學(xué)習(xí)曲線更平緩,允許開發(fā)者隨時(shí)間逐步掌握更高級(jí)的語(yǔ)言特性
實(shí)際應(yīng)用案例
1. Lance:高性能、低成本的向量數(shù)據(jù)庫(kù)
創(chuàng)始人 Chang She 和 Lei Xu 最初使用 C++ 編寫代碼庫(kù),但當(dāng)他們不再需要處理 CMake 時(shí),決定轉(zhuǎn)向 Rust。Chang 表示:"從 C++ 轉(zhuǎn)向 Rust 的決定源于我可以更高效地工作,在不損失性能的同時(shí),也不必處理 CMake。我們用了大約 4 個(gè)月的時(shí)間用 Rust 重寫了之前的 C++ 代碼,每次用 Rust 編寫和發(fā)布新功能時(shí),我們都更加確信不會(huì)遇到段錯(cuò)誤。"
2. Pydantic:面向開發(fā)者的 Python 驗(yàn)證庫(kù)
Pydantic 團(tuán)隊(duì)用 Rust 重寫了第二個(gè)版本,即使是簡(jiǎn)單模型也實(shí)現(xiàn)了 20 倍的性能提升。除了性能改進(jìn)外,Rust 還帶來(lái)了其他優(yōu)勢(shì)。Pydantic 創(chuàng)始人 Samuel Colvin 指出:"Rust 編寫的代碼通常更易于使用和維護(hù)。特別是 Rust 能捕獲和處理所有可能的錯(cuò)誤,而 Python(和 TypeScript)的類型系統(tǒng)往往會(huì)忽略這些錯(cuò)誤。"
未來(lái)展望
展望未來(lái),越來(lái)越多的庫(kù)將采用 Python 作為前端、Rust 作為后端的開發(fā)模式??偟膩?lái)說(shuō),當(dāng)今的 Python 開發(fā)者在構(gòu)建高性能庫(kù)時(shí),擁有了更好、更流暢的開發(fā)方式。