Rust VS Python:為什么越來越流行,取代榜一Python?
2021 年,Python 又獲得了 TIOBE 年度編程語言,排名已經是第一。而 Rust 依然在 20 名以外。但依然有人認為,Rust 甚至可能取代 Python。不過這不重要,認清兩者的優缺點,進而合適的地方使用合適的語言,這才最重要。
在這個指南中,我們將比較 Rust 和 Python 這兩門語言,同時將討論它們各自的應用場景,回顧使用 Rust vs. Python 的優缺點,并解釋 Rust 為什么越來越受歡迎(甚至可能取代 Python)。
01 Rust 是什么?
Rust [1] 是一門系統編程語言,專注于安全,尤其是并發安全,支持函數式和命令式以及泛型等編程范式的多范式語言。Rust 在語法上和 C++ 類似,但是設計者想要在保證性能的同時提供更好的內存安全。Rust 最初是由 Mozilla 研究院的 Graydon Hoare 設計創造,然后在 Dave Herman, Brendan Eich 以及很多其他人的貢獻下逐步完善的。Rust 的設計者們通過在研發 Servo 網站瀏覽器布局引擎過程中積累的經驗優化了 Rust 語言和 Rust 編譯器。
Rust 擁有 優秀的文檔 [2] 、友好的編譯器和有用的錯誤消息,以及頂級工具,包括集成包管理器、構建工具、支持自動完成和類型檢查的智能多編輯器、自動格式化程序等等。
Rust 發布于 2010 年。雖然和 Python 相比,Rust 是一門年輕的語言,但是它的社區正在穩步增長。事實上,Rust 已經連續五年(2016,2017,2018,2019,2020)在 Stack Overflow 開發者調查的“最受喜愛編程語言”評選項目中摘取桂冠。
乍一看,Rust 的靜態化和強類型化可能看起來有點極端。但從長遠來看,這有助于防止意外的代碼行為。
02 Python 是什么?
Python [3] 是一門旨在幫助開發人員更有效地工作和更有效地集成系統的編程語言。Python 提供了高效的高級數據結構,還能簡單有效地面向對象編程。Python 語法和動態類型,以及解釋型語言的本質,使它成為多數平臺上寫腳本和快速開發應用的編程語言,隨著版本的不斷更新和語言新功能的添加,逐漸被用于獨立的、大型項目的開發。如果速度是最重要的,可以使用較低級別的 API 調用,如 CPython [4] 。
1991 年 Guido van Rossum 推出了 Python,以其代碼的可讀性、無分號和花括號而著稱。
除了可擴展性之外,Python 還是一門解釋型語言,這使得它比大多數編譯型語言要慢。正如您可能期望的那樣,Python 擁有一個龐大的庫生態系統和一個龐大的專業社區。
03 什么時候使用 Rust
Rust 被應用于系統開發、操作系統、企業系統、微控制器應用、嵌入式系統、文件系統、瀏覽器組件、虛擬現實的仿真引擎等。
當性能很重要的時候,Rust 是一種常用的語言,因為它能很好地處理大量數據。它可以處理 CPU 密集型的操作,如執行算法,這就是為什么 Rust 比 Python 更適合系統開發的原因。
Rust 保證了內存的安全性,讓你可以控制線程行為和線程之間的資源分配方式。這使你能夠構建復雜的系統,也使得 Rust 比 Python 更有優勢。
總而言之,你應在以下情況下使用 Rust:
- 你的項目需要高性能
- 你正在構建復雜的系統
- 你重視內存安全而不是簡單性
04 什么時候使用 Python
Python 可以用于許多應用領域,從 Web 開發,到數據科學和分析,到 AI 和機器學習,再到軟件開發。
Python 被廣泛用于機器學習,數據科學和 AI,因為它:
- 簡單且容易
- 靈活
- 包含大量面向數據的軟件包和庫
- 有出色的工具和庫生態系統支持
在以下情況下,你應該使用 Python:
- 你需要一種靈活的語言來支持 Web 開發,數據科學和分析以及機器學習和 AI
- 你重視可讀性和簡單性
- 你需要一種對初學者友好的語言
- 與性能相比,你更喜歡語法簡單和開發速度
05 為什么 Rust 可以取代 Python
考慮到 Rust 的迅速普及、受歡迎程度和廣泛的使用案例,它幾乎不可避免地會在不久的將來超越 Python,以下是一些原因。
性能
Rust 超越 Python 的一個主要原因是性能。因為 Rust 是直接編譯成機器代碼的,所以在你的代碼和計算機之間沒有虛擬機或解釋器。
與 Python 相比,另一個關鍵優勢是 Rust 的線程和內存管理。雖然 Rust 不像 Python 那樣有垃圾回收機制,但 Rust 中的編譯器會強制檢查無效的內存引用泄漏和其他危險或不規則行為。
編譯語言通常比解釋語言要快。但是,使 Rust 處于不同水平的是,它幾乎與 C 和 C ++一樣快,而且沒有額外開銷。
讓我們看一個用 Python 編寫的 O(log n) 程序的示例,并使用迭代方法計算完成任務所需的時間:
- import random
- import datetime
- def binary_searcher(search_key, arr):
- low = 0
- high = len(arr)-1
- while low <= high:
- mid = int(low + (high-low)//2)
- if search_key == arr[mid]:
- return True
- if search_key < arr[mid]:
- high = mid-1
- elif search_key > arr[mid]:
- low = mid+1
- return False
輸出:
- > python -m binny.py
- It took 8.6μs to search
現在,讓我們來看一下使用迭代方法用 Rust 編寫的定時 O(log n) 程序:
- >use rand::thread_rng;
- use std::time::Instant;
- use floating_duration::TimeFormat;
- fn binary_searcher(search_key: i32, vec: &mut Vec<i32>) -> bool {
- let mut low: usize = 0;
- let mut high: usize = vec.len()-1;
- let mut _mid: usize = 0;
- while low <= high {
- _mid = low + (high-low)/2;
- if search_key == vec[_mid] {
- return true;
- }
- if search_key < vec[_mid] {
- high = _mid - 1;
- } else if search_key > vec[_mid] {
- low = _mid + 1;
- }
- }
- return false;
- }
- fn main() {
- let mut _rng = thread_rng();
- let mut int_vec = Vec::new();
- let max_num = 1000000;
- for num in 1..max_num {
- int_vec.push(num as i32);
- }
- let start = Instant::now();
- let _result = binary_searcher(384723, &mut int_vec);
- println!("It took: {} to search", TimeFormat(start.elapsed()));
- }
輸出:
- > cargo run
- Finished dev [unoptimized + debuginfo] target(s) in 0.04s
- Running target\debug\algo_rusty.exe
- It took: 4.6μs to search
在沒有使用任何優化技術的情況下,Rust 和 Python 在同一臺機器上執行類似的操作分別需要 4.6 微秒和 8.6 微秒。這意味著 Python 花費的時間幾乎是 Rust 的兩倍。
內存管理
Python 和大多數現代編程語言一樣,被設計成內存安全的。然而,即使沒有垃圾回收。Rust 在內存安全方面卻讓 Python 望塵莫及。
Rust 采用了一種獨特的方式來確保內存安全,其中涉及所有權系統和借用檢查器(borrow checker)。Rust 的借用檢查器確保引用和指針不會超過它們所指向的數據。
錯誤檢查與診斷
Python 和其他語言一樣,提供了錯誤檢查和日志機制。但是在讓開發者知道哪里出了什么問題的時候,Rust 和 Python 之間有一些差異。
舉一個 Python 變量錯誤的典型例子:
- apple = 15
- print('The available apples are:', aple)
Python 輸出:
- Traceback (most recent call last):
- File "binny.py", line 2, in <module>
- print('The available apples are:', aple)
- NameError: name 'aple' is not defined
Rust 中的類似示例:
- fn main() {
- let apple = 15;
- println!("The available apples are:", aple);
- }
Rust 輸出:
- println!("The available apples are:", aple);
- ^^^^ help: a local variable with a similar name exists: `apple`
在這里,Rust 推薦了可能的變量,這些變量可能是你想輸入的。Python 只會拋出錯誤,而不會給出如何修復的建議。
再舉個例子:
- fn main() {
- let grass = 13;
- grass += 1;
- }
此代碼引發錯誤,因為默認情況下 Rust 中的變量是不可變的。除非它具有關鍵字 mut ,否則無法更改。
錯誤:
- let grass = 13;
- | -----
- | |
- | first assignment to `grass`
- | help: make this binding mutable: `mut grass`
修正錯誤:
- fn main() {
- let mut _grass: i32 = 13;
- _grass += 1;
- }
如你所見,現在它不會引發任何錯誤。除此之外,Rust 不允許不同的數據類型相互操作,除非將它們轉換為相同的類型。
因此,維護 Rust 代碼庫通常很容易。除非指定,否則 Rust 不允許更改。Python 是允許這種性質的更改的。
與大多數編譯語言相比,Rust 因其速度快、內存安全有保證、超強的可靠性、一致性和用戶友好性而備受青睞。在編程中,我們已經到了速度開始變得毫不費力的地步。
隨著技術的發展,它變得越來越快,試圖在更短的時間內做更多的事情,而不需要那么多的權衡。Rust 幫助實現了這一點,同時又不妨礙開發者的工作。當技術試圖推動可以實現的邊界時,它也會考慮系統的安全性和可靠性,這是 Rust 背后的主要思想。
并行運算
除了速度外,Python 在并行計算方面也有局限性。
Python 使用全局解釋器鎖(GIL),它鼓勵只有一個線程同時執行,以提高單線程的性能。這是一大局限,因為它意味著你不能使用多個 CPU 核進行密集計算。
社區
如前所述,Stack Overflow 的“ 2020 開發人員調查”中有 86%的受訪者將 Rust 稱為 2020 年最喜歡的編程語言。
同樣,“ 2020 HackerRank 開發人員技能報告”的受訪者將 Rust 列為他們計劃下一步學習的十大編程語言:
相比之下,2019 年的調查將 Rust 排在列表的底部,這表明 Rust 開發人員社區正在迅速增長。
這些數據表明,Rust 正在成為主流開發者社區的一部分。許多大公司都在使用 Rust,一些開發者甚至用它來構建其他編程語言使用的庫。著名的 Rust 用戶包括 Mozilla、Dropbox、Atlassian、npm 和 Cloudflare 等等。
Amazon Web Service 還對 Lambda,EC2 和 S3 中的性能敏感組件采用了 Rust。在 2019 年,AWS 宣布贊助 Rust 項目,此后為 Rust 提供了 AWS 開發工具包。
公司正越來越多地用更高效的編程語言(如 Rust)取代速度較慢的編程語言。沒有其他語言能像 Rust 一樣在簡單和速度之間做出平衡。
06 總結
Rust 已經發展成為一門易于使用的編程語言,因此它的使用率有所提高。盡管 Python 在機器學習/數據科學社區中占有堅實的地位,但 Rust 在未來很可能被用作 Python 庫更有效的后端。
Rust 具有取代 Python 的巨大潛力。目前的趨勢是,在應用程序、性能和速度方面,Rust 不僅僅是一種編程語言,它還是一種思維方式。