為什么要用Rust取代C/C ++重寫Python底層?


https://www.techug.com/post/rewrite-python-with-rust.html?utm_source=tuicool&utm_medium=referral

Rust是Mozilla開發的注重性能和內存安全的語言,它的設計目的是逐漸取代C/C ++,但這個過程還需要一段時間。

值得肯定的是,Rust在現有階段可以取代傳統上部分C語言庫。用於統計和機器學習的Python系統中的大部分內容都是用C語言編寫而成的,所以模塊被重寫的可能性非常大。

 

 
圖0:為什么要用Rust取代C/C ++重寫Python底層?

 

雖然Rust是編譯型語言,Python是解釋型語言,但是由於兩者的ABI(應用程序二進制接口)在設計上存在相似性,Rust代碼可以應用到Python上。現在一些Rust包已經被用於Python綁定,通過Rust庫也可以將C語言的API應用到Python上。

大量新項目的應用使得開發Rust庫更容易,方便綁定Python和部署具有Rust二進制文件的Python軟件包。下面4個項目的實際應用,說明結合Python與Rust在一定程度上完全可以取代C/C ++。

Rust-CPython

定義:Rust-Cpython就是在Rust中CPython運行時的一組綁定,Rust程序連接到CPython上,使用它的ABI來運行Python程序,在Rust環境下與Python的面向對象一起工作。

適用對象:熟練使用控制CPython的Rust程序員。需要注意的是,由於Python對象管理方式的問題,Rust的內存安全性能並不能完全發揮作用,所以使用要謹慎。

 

 
圖1:為什么要用Rust取代C/C ++重寫Python底層?

 

PyO3

定義:對於Rust開發人員來講,PyO3項目提供了兩個方向的基本方法來編寫綁定Python的Rust軟件。Rust程序可以與Python對象和解釋器接口,並且可以與C模塊相同的方式將Rust應用到Python中。

PyO3支持的Python功能有限,但是實現最基本的功能還是可以的。PyO3慣用的Rust功能是通過裝飾既有代碼去實現Python-aware。

適用人員:那些編寫與Python運行直接交互模塊的程序員。

Snaek

定義:在這個項目的早期階段,Snaek允許開發人員根據需要創建加載Python動態的Rust庫,但是這個Rust庫不依賴於靜態連接Python的運行。Rust庫使用Snaek時,不需要專門針對Python進行編寫,只公開C語言兼容的方法就可以了。但Snaek的一個潛在缺點是不能使用ctypes,ctypes是與C代碼接口的標准Python庫,它使用的是cffi。cffi是由PyPy團隊開發的一個備選庫,學習cffi並不難,但如果真的要使用cffi,一些已經使用ctypes的項目都需要重寫。

適用人員:將Rust寫入的方法應用到Python腳本中或想對Python做進一步了解的Rust程序員。

 

 
圖2:為什么要用Rust取代C/C ++重寫Python底層?

 

Cookiecutter

定義:這個項目涉及將二進制模塊與Python庫綁定時出現的常見問題。Cookiecutter從模板創建Python項目,可用的模板Cookiecutter PyPackage Rust Cross-Platform Publish簡化了將Rust二進制文件與Python庫捆綁在一起的過程。

這個項目非常重要的目標是能夠生成二進制分發(Wheel),這樣就不需要最終用戶自己編譯Rust代碼。Windows用戶經常因為缺乏預編譯的Windows二進制Python包在工作中受阻,所以這個項目應該是非常受歡迎的。

適用人員:那些用Rust綁定創建許多Python項目或試圖發布項目的程序員。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM