注意: 雖然 JavaScript 對於本網站不是必需的,但您與內容的互動將受到限制。請開啟 JavaScript 以獲得完整的體驗。

Python 與其他語言的比較

Python 與其他語言的比較

免責宣告:本文寫於 1997 年左右。它帶有時代的印記。此處保留僅作為歷史文獻。——Guido van Rossum

Python 經常被拿來與其他解釋型語言進行比較,例如 Java、JavaScript、Perl、Tcl 或 Smalltalk。與 C++、Common Lisp 和 Scheme 的比較也很有啟發性。在本節中,我將簡要地將 Python 與這些語言進行比較。這些比較僅側重於語言問題。在實踐中,程式語言的選擇往往取決於其他現實世界的限制,例如成本、可用性、培訓、前期投入,甚至是情感依戀。由於這些方面高度可變,因此在這種比較中過多地考慮它們似乎是浪費時間。

Java

Python 程式通常預計比 Java 程式執行得慢,但開發時間也大大減少。Python 程式通常比等效的 Java 程式短 3-5 倍。這種差異可歸因於 Python 內建的高階資料型別及其動態型別。例如,Python 程式設計師無需宣告引數或變數的型別,而且 Python 強大的多型列表和字典型別(語言中直接內建了豐富的語法支援)在幾乎每個 Python 程式中都能找到用途。由於執行時型別檢查,Python 的執行時必須比 Java 更努力地工作。例如,在計算表示式 a+b 時,它必須首先檢查物件 a 和 b 以找出它們的型別,這在編譯時是未知的。然後它呼叫適當的加法操作,這可能是一個過載的使用者定義方法。另一方面,Java 可以執行高效的整數或浮點加法,但需要宣告 a 和 b 的變數,並且不允許對使用者定義類的例項過載 + 運算子。

由於這些原因,Python 更適合作為“膠水”語言,而 Java 更適合作為低階實現語言。實際上,兩者結合起來是一個極佳的組合。元件可以在 Java 中開發,然後用 Python 組合成應用程式;Python 也可以用於元件的原型設計,直到它們的設計可以在 Java 實現中“固化”。為了支援這種型別的開發,一個用 Java 編寫的 Python 實現正在開發中,它允許從 Java 呼叫 Python 程式碼,反之亦然。在這個實現中,Python 原始碼被翻譯成 Java 位元組碼(在執行時庫的幫助下支援 Python 的動態語義)。

JavaScript

Python 的“基於物件”子集大致相當於 JavaScript。像 JavaScript(與 Java 不同)一樣,Python 支援一種使用簡單函式和變數的程式設計風格,而無需參與類定義。然而,對於 JavaScript 來說,這就是全部。另一方面,Python 透過真正的面向物件程式設計風格支援編寫更大的程式和更好的程式碼重用,其中類和繼承扮演著重要的角色。

Perl

Python 和 Perl 來自相似的背景(Unix 指令碼,兩者都已經遠超其原始領域),並且擁有許多相似的功能,但哲學不同。Perl 強調支援常見的面向應用程式的任務,例如內建正則表示式、檔案掃描和報告生成功能。Python 強調支援常見程式設計方法,如資料結構設計和麵向物件程式設計,並鼓勵程式設計師透過提供優雅但不晦澀的符號來編寫可讀(因此可維護)的程式碼。因此,Python 接近 Perl,但在其原始應用領域很少能擊敗它;然而,Python 的適用性遠遠超出 Perl 的利基市場。

Tcl

像 Python 一樣,Tcl 可以用作應用程式擴充套件語言,也可以用作獨立的程式語言。然而,傳統上將所有資料儲存為字串的 Tcl 在資料結構方面較弱,並且執行典型程式碼的速度比 Python 慢得多。Tcl 也缺乏編寫大型程式所需的功能,例如模組化名稱空間。因此,雖然使用 Tcl 的“典型”大型應用程式通常包含用 C 或 C++ 編寫的特定於該應用程式的 Tcl 擴充套件,但等效的 Python 應用程式通常可以用“純 Python”編寫。當然,純 Python 開發比編寫和除錯 C 或 C++ 元件要快得多。有人說 Tcl 的唯一可取之處是 Tk 工具包。Python 已將 Tk 的介面作為其標準 GUI 元件庫。

Tcl 8.0 透過提供一個帶有有限資料型別支援的位元組碼編譯器解決了速度問題,並增加了名稱空間。然而,它仍然是一種更笨拙的程式語言。

Smalltalk

Python 和 Smalltalk 之間最大的區別可能在於 Python 更“主流”的語法,這使其在程式設計師培訓方面佔據優勢。像 Smalltalk 一樣,Python 具有動態型別和繫結,Python 中的一切都是物件。然而,Python 區分內建物件型別和使用者定義類,並且目前不允許從內建型別繼承。Smalltalk 的集合資料型別標準庫更完善,而 Python 的庫提供了更多處理網際網路和全球資訊網(如電子郵件、HTML 和 FTP)的設施。

Python 在開發環境和程式碼分發方面有著不同的理念。Smalltalk 傳統上有一個包含環境和使用者程式的整體“系統映象”,而 Python 將標準模組和使用者模組儲存在單獨的檔案中,這些檔案可以輕鬆地重新組織或在系統外部分發。一個結果是,將圖形使用者介面 (GUI) 附加到 Python 程式有不止一種選擇,因為 GUI 沒有內建到系統中。

C++

幾乎所有關於 Java 的內容也適用於 C++,甚至更甚:Python 程式碼通常比等效的 Java 程式碼短 3-5 倍,而它通常比等效的 C++ 程式碼短 5-10 倍!軼事證據表明,一名 Python 程式設計師可以在兩個月內完成兩名 C++ 程式設計師一年都無法完成的工作。Python 作為一種膠水語言大放異彩,用於組合用 C++ 編寫的元件。

Common Lisp 和 Scheme

這些語言在動態語義上與 Python 接近,但在語法方法上卻截然不同,以至於比較幾乎成了一場宗教爭論:Lisp 缺乏語法是優點還是缺點?應該指出的是,Python 具有與 Lisp 相似的自省能力,Python 程式可以即時構建和執行程式片段。通常,現實世界的屬性是決定性的:Common Lisp 很大(從各個意義上說),而 Scheme 世界則被許多不相容的版本所碎片化,而 Python 擁有一個單一、免費、緊湊的實現。