中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PyPy的原理是什么

發布時間:2021-12-17 17:42:21 來源:億速云 閱讀:168 作者:iii 欄目:大數據

這篇文章主要講解了“PyPy的原理是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PyPy的原理是什么”吧!

項目背景

PyPy 是 Python 開發者為了更好地 Hack Python 創建的項目。此外,PyPy 比 CPython 更靈活,易于使用和試驗,以制定具體的功能在不同情況的實現方法,可以很容易實施。該項目的目標是,讓 PyPy 比 C 實現的 Python 更為容易地適應各個項目和方便裁剪。 

項目現狀

PyPy 是 Armin Rigo 開發的,Python 語言的動態編譯器,是 Psyco 的后繼項目。PyPy 的目的是,做到 Psyco 沒有做到的動態編譯。

PyPy 開始只是研究性質的項目。但是開發非常成熟,在 2007 年中旬發布了 1.0 Release 版本后,大家關注的焦點是,能否在 2008 年出現可供生產環境使用的版本。

它支持 Python 語言的所有核心部分以及大多數的 Python 語言標準庫函數模塊,并且通過了 Python 語言的 test suite。與 CPython 的區別可以去看它的兼容性頁面.

PyPy 還提供了 JIT 編譯器和沙盒功能,因此運行速度比 CPython 要快,以及可以安全地運行一些不被信任的代碼。PyPy 還有一個單獨的支持微線程的版本。

另外,PyPy 也有每夜構建版本供開發者測試。

PyPy 是作為 Specific Targeted Research Projects(特定領域研究項目)從 2004 年 12 月到 2007 年 3 月,開始接受歐盟的援助。

 

PyPy 的原理

我們通過一個例子與 Python 執行過程對比來看PyPy 的原理[2]

你本來有個 python 代碼:

def add(x, y):
   return x + y
 

然后 CPython 執行起來大概是這樣(偽代碼):

if instance_has_method(x, '__add__') {
   return call(x, '__add__', y) // x.__add__ 里面又有一大堆針對不同類型的 y 的判斷
} else if isinstance_has_method(super_class(x), '__add__' {
   return call(super_class, '__add__', y)
} else if isinstance(x, str) and isinstance(y, str) {
   return concat_str(x, y)
} else if isinstance(x, float) and isinstance(y, float) {
   return add_float(x, y)
} else if isinstance(x, int) and isinstance(y, int) {
   return add_int(x, y)
} else ...
 

這下能看出來因為 Python 的動態類型,一個簡單的函數里面要有這么多判斷才能正確執行。然后這還沒完,你以為里面把兩個整數相加的函數,就是 C 語言里面的 x + y 么?naive。實際上 Python 里面一個 int 大概是個這樣的結構體(也是偽代碼,真實情況要比這個復雜):

struct {
   prev_gc_obj *obj
   next_gc_obj *obj
   type int
   value int
   ... other fields
}
 

然后每個 int 都是這樣的結構體,還是動態分配出來放在 heap 上的,里面的 value 還不能變,也就是說你算 1000 這個結構體加 2000 這個結構體,得出來 3000 這個結構體,還要去 heap 上 malloc 一個結構體來。CPython 每次就這么老老實實的執行這個過程,就算你每次調用 add 函數都是只傳兩個整數。然后 pypy 執行的時候,發現執行了一百遍 add 函數,發現你 TM 每次都只傳兩個整數進來,那我何苦每次還給你做這么多計算,于是當場生成了一個類似 C 的函數:

int add_int_int(int x, int y) {
 return x + y;
}

然后當場編譯成機器碼,然后你下次每次調用 add(1, 2) 的時候,直接就調用這個 “Native” 的函數,你說你 Pypy 快不快?上面這個過程就叫做 Just In Time 編譯,也就是 JIT,肯定比 CPython 的執行速度要快了。當然 JIT 也有很多問題,比如編譯本身也很花時間,如果這段代碼本來就只執行一次,需要 1s,但是你把它編譯出來需要 10s,那 JIT 就得不償失了。所以很多 JIT 實現都會先解釋執行,然后確定了一段代碼經常被執行之后,再進行編譯。并且分多層 JIT,比較初級的對編譯出來的機器碼不做比較復雜的優化什么的。

感謝各位的閱讀,以上就是“PyPy的原理是什么”的內容了,經過本文的學習后,相信大家對PyPy的原理是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

公主岭市| 义乌市| 绥芬河市| 西宁市| 桑日县| 南木林县| 阿克苏市| 姚安县| 景泰县| 久治县| 资兴市| 阳西县| 襄垣县| 汝南县| 紫云| 牡丹江市| 改则县| 中西区| 西乌| 奎屯市| 时尚| 太仓市| 福建省| 白玉县| 年辖:市辖区| 肃北| 滨海县| 孙吴县| 新民市| 平山县| 赤水市| 光山县| 清水河县| 清涧县| 沂源县| 商都县| 陇南市| 淮阳县| 霍城县| 长子县| 松潘县|