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:

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

原文鏈接:https://blog.logrocket.com/rust-vs-python-why-rust-could-replace-python/

參考資料

[1]

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

[2]

優秀的文檔: https://doc.rust-lang.org/book/

[3]

Python: https://www.python.org/

[4]

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

[5]

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Nf49Ozm64AH2e-oUcdT3QA