掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
對于研究人員來說,迅速把想法代碼化并查看其是否行得通至關重要。Python 是能夠?qū)崿F(xiàn)這一目標的出色語言,它能夠讓人們專注于想法本身,而不必過度為代碼格式等無聊的事情困擾。

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設服務10余年為成都成都辦公空間設計小微創(chuàng)業(yè)公司專業(yè)提供成都企業(yè)網(wǎng)站建設營銷網(wǎng)站建設商城網(wǎng)站建設手機網(wǎng)站建設小程序網(wǎng)站建設網(wǎng)站改版,從內(nèi)容策劃、視覺設計、底層架構、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設服務。
但是,Python 有一個致命的缺點:速度比 C、C ++ 等語言慢很多。那么,構建一個 Python 原型測試想法之后,如何將其轉(zhuǎn)變?yōu)榭焖偾腋咝阅艿墓ぞ??通常來說,人們還要再進行一步工作:將 Python 代碼手動轉(zhuǎn)換為 C 語言的代碼。但如果 Python 原型本身就可以運行得很快,那么轉(zhuǎn)換代碼的時間就可以做一些更有意義的事情。
而 PyPy,恰好可以解決這一問題。它能夠讓 Python 代碼運行得比 C 還快。
import time
from termcolor import colored
start = time.time()
number = 0
for i in range(100000000):
number += i
print(colored("FINISHED", "green"))
print(f"Ellapsed time: {time.time() - start} s")
為了證明 PyPy 的速度,使用默認的 Python 解釋器和 PyPy 運行上述代碼,執(zhí)行一個從整數(shù) 0 加到 100,000,000 的循環(huán), 然后打印出運行時間。運行結果如下:
運行時間 Python vs PyPy
這不是學術意義上的評估,但該結果是令人驚嘆的。與大約需要 10 秒鐘的默認 Python 解釋器相比,PyPy 僅用 0.22 秒就完成了執(zhí)行。而且無需進行任何更改就可以直接將 Python 代碼放到 PyPy 上。而同一臺計算機上,等效的 C 語言實現(xiàn)需要 0.32 秒,PyPy 甚至擊敗了最快的 C 語言。
盡管代碼完全相同,但代碼的執(zhí)行方式卻大不相同。PyPy 提升速度的秘訣是「即時編譯( just-in-time compilation)」,即 JIT 編譯。
C、C ++、Swift、Haskell、Rust 等編程語言通常是提前編譯(AOT 編譯)的。這意味著用這些語言編寫代碼之后,編譯器會將源代碼轉(zhuǎn)換成特定計算機架構可讀的機器碼。也就是說在執(zhí)行程序時,執(zhí)行的并不是原始源代碼,而是機器碼。
提前編譯把源代碼轉(zhuǎn)化為機器代碼
與 C 語言等上述語言不同,Python、JavaScript、PHP 等語言采用另一種方法——解釋語言。與將源代碼轉(zhuǎn)換為機器碼相比,解釋的過程中源代碼是保持不變的。每次運行程序時,解釋器都會逐行查看代碼并運行。例如,每個 Web 瀏覽器都內(nèi)置了 JavaScript 解釋器。
解釋器逐行運行程序
PyPy 是利用即時編譯來執(zhí)行 Python 代碼的。即 PyPy 不同于解釋器,它并不會逐行運行代碼,而是在執(zhí)行程序前先將部分代碼編譯成機器碼。
JIT 編譯綜合了提前編譯和解釋
如上圖所示,而 PyPy 使用的 JIT 編譯是解釋和提前編譯的結合,可以利用提前編譯來提高性能,并提高解釋型語言的靈活性和跨平臺可用性。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流