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

PyPy為什么能讓Python比C還快?一文了解內(nèi)在機(jī)制

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

[[397277]]

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

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

而 PyPy,恰好可以解決這一問題。它能夠讓 Python 代碼運(yùn)行得比 C 還快。

  1. import time 
  2. from termcolor import colored 
  3.  
  4. start = time.time() 
  5. number = 0 
  6. for i in range(100000000): 
  7.     number += i 
  8.      
  9. print(colored("FINISHED", "green")) 
  10. print(f"Ellapsed time: {time.time() - start} s") 

為了證明 PyPy 的速度,使用默認(rèn)的 Python 解釋器和 PyPy 運(yùn)行上述代碼,執(zhí)行一個從整數(shù) 0 加到 100,000,000 的循環(huán), 然后打印出運(yùn)行時間。運(yùn)行結(jié)果如下:

圖片

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

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

為什么 PyPy 這么快?

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

提前編譯

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

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

解釋語言

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

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

即時編譯

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

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

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

原文鏈接:https://towardsdatascience.com/run-your-python-code-as-fast-as-c-4ae49935a826

【本文是51CTO專欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號“機(jī)器之心( id: almosthuman2014)”】 

戳這里,看該作者更多好文

 

責(zé)任編輯:趙寧寧 來源: 51CTO專欄
相關(guān)推薦

2024-01-16 16:39:33

PythonPyPy

2024-07-26 00:00:10

2025-01-15 09:06:57

servlet服務(wù)器Java

2022-07-03 08:25:09

OSITCP/IP

2022-09-29 13:09:38

DataClassPython代碼

2020-08-27 07:34:50

Zookeeper數(shù)據(jù)結(jié)構(gòu)

2019-07-04 15:16:52

數(shù)據(jù)挖掘大數(shù)據(jù)算法

2022-09-06 11:21:49

光網(wǎng)絡(luò)光纖

2023-05-17 11:33:45

梯度下降機(jī)器學(xué)習(xí)

2024-05-27 00:00:00

.NET游戲引擎C#

2022-03-14 08:01:06

LRU算法線程池

2018-04-25 10:13:30

Redis內(nèi)存模型

2023-11-20 08:18:49

Netty服務(wù)器

2023-04-26 15:43:24

容器編排容器編排工具

2024-12-27 16:30:42

2022-02-25 07:34:36

MQTT協(xié)議RabbitMQ

2023-11-06 08:16:19

APM系統(tǒng)運(yùn)維

2022-06-08 08:11:56

威脅建模網(wǎng)絡(luò)安全網(wǎng)絡(luò)攻擊

2022-11-11 19:09:13

架構(gòu)

2024-06-24 08:05:00

人工智能AI
點(diǎn)贊
收藏

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