Rust VS Python:為什麼越來越流行,取代 Python?

語言: CN / TW / HK

關注「 Rust程式設計指北 」,一起學習 Rust,給未來投資

大家好,我是螃蟹哥。

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 不僅僅是一種程式語言,它還是一種思維方式。

原文連結:http://blog.logrocket.com/rust-vs-python-why-rust-could-replace-python/

參考資料

[1]

Rust: http://www.rust-lang.org/

[2]

優秀的文件: http://doc.rust-lang.org/book/

[3]

Python: http://www.python.org/

[4]

CPython: http://github.com/python/cpython

[5]

試試 LogRocket: http://logrocket.com/signup

推薦閱讀

覺得不錯,點個贊吧

掃碼關注「 Rust程式設計指北