自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入剖析PyPy,解鎖Python比C還快的秘訣

開(kāi)發(fā) 前端
對(duì)于研究人員來(lái)說(shuō),迅速把想法代碼化并查看其是否行得通至關(guān)重要。Python 是能夠?qū)崿F(xiàn)這一目標(biāo)的出色語(yǔ)言,它能夠讓人們專(zhuān)注于想法本身,而不必過(guò)度為代碼格式等無(wú)聊的事情困擾。

對(duì)于研究人員來(lái)說(shuō),迅速把想法代碼化并查看其是否行得通至關(guān)重要。Python 是能夠?qū)崿F(xiàn)這一目標(biāo)的出色語(yǔ)言,它能夠讓人們專(zhuān)注于想法本身,而不必過(guò)度為代碼格式等無(wú)聊的事情困擾。

但是,Python 有一個(gè)致命的缺點(diǎn):速度比 C、C ++ 等語(yǔ)言慢很多。那么,構(gòu)建一個(gè) Python 原型測(cè)試想法之后,如何將其轉(zhuǎn)變?yōu)榭焖偾腋咝阅艿墓ぞ??通常?lái)說(shuō),人們還要再進(jìn)行一步工作:將 Python 代碼手動(dòng)轉(zhuǎn)換為 C 語(yǔ)言的代碼。但如果 Python 原型本身就可以運(yùn)行得很快,那么轉(zhuǎn)換代碼的時(shí)間就可以做一些更有意義的事情。

而 PyPy,恰好可以解決這一問(wèn)題。它能夠讓 Python 代碼運(yùn)行得比 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 的速度,使用默認(rèn)的 Python 解釋器和 PyPy 運(yùn)行上述代碼,執(zhí)行一個(gè)從整數(shù) 0 加到 100,000,000 的循環(huán), 然后打印出運(yùn)行時(shí)間。運(yùn)行結(jié)果如下:

運(yùn)行時(shí)間 Python vs PyPy運(yùn)行時(shí)間 Python vs PyPy

這不是學(xué)術(shù)意義上的評(píng)估,但該結(jié)果是令人驚嘆的。與大約需要 10 秒鐘的默認(rèn) Python 解釋器相比,PyPy 僅用 0.22 秒就完成了執(zhí)行。而且無(wú)需進(jìn)行任何更改就可以直接將 Python 代碼放到 PyPy 上。而同一臺(tái)計(jì)算機(jī)上,等效的 C 語(yǔ)言實(shí)現(xiàn)需要 0.32 秒,PyPy 甚至擊敗了最快的 C 語(yǔ)言。

為什么 PyPy 這么快?

盡管代碼完全相同,但代碼的執(zhí)行方式卻大不相同。PyPy 提升速度的秘訣是「即時(shí)編譯( just-in-time compilation)」,即 JIT 編譯。

提前編譯 

C、C ++、Swift、Haskell、Rust 等編程語(yǔ)言通常是提前編譯(AOT 編譯)的。這意味著用這些語(yǔ)言編寫(xiě)代碼之后,編譯器會(huì)將源代碼轉(zhuǎn)換成特定計(jì)算機(jī)架構(gòu)可讀的機(jī)器碼。也就是說(shuō)在執(zhí)行程序時(shí),執(zhí)行的并不是原始源代碼,而是機(jī)器碼。

提前編譯把源代碼轉(zhuǎn)化為機(jī)器代碼提前編譯把源代碼轉(zhuǎn)化為機(jī)器代碼

解釋語(yǔ)言 

與 C 語(yǔ)言等上述語(yǔ)言不同,Python、JavaScript、PHP 等語(yǔ)言采用另一種方法——解釋語(yǔ)言。與將源代碼轉(zhuǎn)換為機(jī)器碼相比,解釋的過(guò)程中源代碼是保持不變的。每次運(yùn)行程序時(shí),解釋器都會(huì)逐行查看代碼并運(yùn)行。例如,每個(gè) Web 瀏覽器都內(nèi)置了 JavaScript 解釋器。

解釋器逐行運(yùn)行程序解釋器逐行運(yùn)行程序

即時(shí)編譯

PyPy 是利用即時(shí)編譯來(lái)執(zhí)行 Python 代碼的。即 PyPy 不同于解釋器,它并不會(huì)逐行運(yùn)行代碼,而是在執(zhí)行程序前先將部分代碼編譯成機(jī)器碼。

JIT 編譯綜合了提前編譯和解釋JIT 編譯綜合了提前編譯和解釋

如上圖所示,而 PyPy 使用的 JIT 編譯是解釋和提前編譯的結(jié)合,可以利用提前編譯來(lái)提高性能,并提高解釋型語(yǔ)言的靈活性和跨平臺(tái)可用性。

責(zé)任編輯:華軒 來(lái)源: 機(jī)器學(xué)習(xí)算法與Python實(shí)戰(zhàn)
相關(guān)推薦

2021-05-04 22:13:56

PyPyPythonC

2021-11-11 06:57:00

PythonPyPy程序

2025-01-21 11:18:46

2023-09-12 12:14:05

Python程序矢量化

2010-03-23 11:02:29

Python 語(yǔ)言

2010-02-06 16:05:51

C++ Vector

2009-09-11 11:09:36

C#引用類(lèi)型

2009-09-02 18:14:33

C# WebClien

2009-09-02 13:36:58

C#實(shí)現(xiàn)多個(gè)接口

2009-09-04 17:56:22

C#刪除數(shù)據(jù)

2024-09-11 08:37:39

2011-08-03 09:43:10

Chrome 13Google

2009-09-03 15:03:27

C#實(shí)現(xiàn)AOP微型框架

2009-09-03 17:42:07

C#開(kāi)發(fā)CF藍(lán)牙模塊

2010-02-04 13:45:36

C++類(lèi)模板

2023-09-12 17:23:23

C語(yǔ)言Mojo模型

2010-03-23 11:17:16

Python 動(dòng)態(tài)編譯

2024-01-09 18:00:22

團(tuán)隊(duì)PyPy遷移開(kāi)源

2009-09-04 17:49:34

C#連接數(shù)據(jù)庫(kù)

2024-08-12 08:36:28

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)