為什麼 C 程式碼執行速度比 Python 快?
在本文中,我們將學習為什麼 C 語言程式碼執行速度比 Python 快。
Guido Van Rossum 開發了 Python,這是最著名的程式語言之一。Python 因其清晰的語法和簡單的程式碼而受到開發人員的歡迎,即使是新手也能輕鬆上手。學習 Python 對剛開始程式設計生涯的人來說非常有利。他們可以使用 Python 程式設計培訓、部落格、影片、模組以及數千種其他資源來深入瞭解這門流行語言的各個方面。完成後,您將能夠進行現代開發活動,例如 GUI 開發、Web 設計、系統管理、複雜的財務交易或計算、資料科學、視覺化等等。
Python 由於是一種解釋型語言,因此比 C 慢。
Python 比 C 慢,因為它是一種解釋型語言。
因此,需要更多真實的 CPU 指令來執行給定的語句。
您可以透過將數字 1 加到 Python 程式碼中的變數值或將其與給定值進行比較(以檢視它是否小於、大於或正好等於該值)來驗證該變數的值。
不同之處在於,Python 程式碼不會立即由 CPU 執行,而是會被解釋。
在效能方面,這將產生天壤之別。
幾乎總是使用虛擬機器來執行 Python 程式碼
虛擬計算機的另一個名稱是“位元組碼直譯器”。
解釋型程式碼始終比實際機器程式碼慢,因為實現一條指令所需的指令比執行一條實際機器指令所需的指令多得多。
示例
考慮表示式 x += 1。在英特爾 CPU 中,暫存器增量是一個單運算元,延遲為 1,倒數吞吐量為三分之一 (1/3)。
換句話說,它指的是英特爾處理器可以提供的最快 CPU 指令。
在 Python 中,如何實現這個 x += 1?
要理解這一點,您必須首先了解 Python 的內部工作原理。
Python 的內部元件包括標記器、詞法分析器、位元組碼生成器和位元組碼直譯器 -
標記器 - 它從給定的 ASCII 文字檔案(Python 程式碼)建立標記流。
詞法分析器 - Python 的這一部分關注適當的縮排和空格。語法檢查在此處發生。
位元組碼生成器 - 如果進行任何最佳化,則由 Python 元件進行;但是,因為 Python 不是編譯型語言,所以與從 C 編譯器獲得的最佳化範圍相比,可用最佳化的範圍受到限制。
稱為“位元組碼直譯器”的 Python 模組管理位元組碼流併為 Python 虛擬機器提供動力(維護其狀態)。
位元組碼生成後通常快取在記憶體中。
因為您不必重複 Python 已經看到的程式碼的標記化、詞法分析和位元組碼生成過程,所以這提高了速度。
因此,我們可以只將位元組碼傳遞給位元組碼直譯器,而不必每次迴圈 while 迴圈時都經歷標記化、詞法分析和位元組碼生成過程。
這難道不更快嗎? 實際上,並非如此。
雖然使用快取的位元組碼更快,但它不會像機器程式碼那樣快速執行或執行。
執行程式碼的真實 CPU 不是虛擬計算機。
編譯過程
與當時的其他編譯語言不同,編譯後的 UCSD Pascal 並未編譯成組合語言。相反,它被編譯成 p 程式碼。
因此,當您想到“編譯的 Pascal 程式”時,就會想到 p 程式碼。如果您喜歡 Java 或 Python 並想假裝自己想出了新東西,請使用“位元組碼”。
此外,Python 包含“編譯的 Python”的概念,它指的是已由標記器、詞法分析器和位元組碼生成器處理的 Python 程式碼,以建立準備提供給位元組碼直譯器(也稱為 Python 虛擬機器)的快取位元組碼。
當您看到副檔名為 .py 的檔案時,它是一個包含 Python 原始碼的 ASCII 文字檔案。
副檔名為“.pyc”的檔案代表已編譯的 Python。
儘管如此,虛擬計算機仍然執行生成的程式碼。
原生程式碼
程式構建完成後,直到它被轉換為其目標平臺的本機二進位制 CPU 指令後,才算完全轉換為原生程式碼。
這通常涉及編寫彙編程式碼,將其傳遞給彙編器,並讓彙編器建立特定於平臺的物件檔案,而不是使用位元組碼。
在程式連線到平臺執行時之前,它還沒有準備好使用。執行時可以提供執行時服務(如動態物件載入)並構建程式碼將在其中執行的環境。在編譯後的 C 中,存在執行時。編譯後的 C++ 也有執行時。
為什麼 Python 比 C 慢?
Python 執行許多健全性檢查 - 整數永遠不會溢位,永遠無法訪問無效記憶體,型別永遠不會(靜默地)不正確,陣列永遠不會寫入或讀取超出其末尾。在 Python 中,很難出現“非區域性錯誤”,但在 C 中,相當常見的是出現一個錯誤,而該錯誤實際上並非報告錯誤的位置。
Python 的編譯器不會進行非常高階的最佳化(如果有的話) - 首先,速度並不像在 C 中那樣重要,而且沒有那麼多資訊可以參考 - 例如,在 Common Lisp(另一種類似於 Python 的動態語言)中,您可以提供型別註釋以獲得與 C 相同的速度 - 如果您選擇退出安全檢查並承諾某些變數將具有某些型別,則會得到完全相同的機器程式碼指令(以及如果程式中存在錯誤,則會得到完全相同的奇怪行為)。
結論
在本文中,我們學習了 C 語言程式碼執行速度比 Python 快的各種原因。