python | CPython和PyPy區別


python是一種編程語言。但這種語言有多種實現,而且與其他語言不同,python並沒有一個專門的機構負責實現,而是由多個社區來實現。

其中使用c語言開發的叫做python,在於別的語言開發的python對比時為避免歧義通常稱為CPython。

同樣的,使用java開發的叫做JPython,使用.net開發的叫做IronPython。

而PyPy與CPython的不同在於,別的一些python實現如CPython是使用解釋執行的方式,這樣的實現方式在性能上是很凄慘的。而PyPy使用了JIT(即時編譯)技術,在性能上得到了提升。


具體講講cpython和pypy:

CPython:是用C語言實現Pyhon,是目前應用最廣泛的解釋器。最新的語言特性都是在這個上面先實現,基本包含了所有第三方庫支持,但是CPython有幾個缺陷,一是(GIL)全局鎖使Python在多線程效能上表現不佳,二是CPython無法支持JIT(即時編譯),導致其執行速度不及Java和Javascipt等語言。於是出現了Pypy。

Pypy:是用Python自身實現的解釋器。針對CPython的缺點進行了各方面的改良,性能得到很大的提升。最重要的一點就是Pypy集成了JIT。但是,Pypy無法支持官方的C/Python API,導致無法使用例如Numpy,Scipy等重要的第三方庫。這也是現在Pypy沒有被廣泛使用的原因吧。


Python的解釋執行

1、由於Python是動態編譯的語言,和C/C++、Java或者Kotlin等靜態語言不同,它是在運行時一句一句代碼地邊編譯邊執行的,而Java是提前將高級語言編譯成了JVM字節碼,運行時直接通過JVM和機器打交道,所以進行密集計算時運行速度遠高於動態編譯語言。 

2、PyPy,它使用了JIT(即時編譯)技術,混合了動態編譯和靜態編譯的特性,仍然是一句一句編譯源代碼,但是會將翻譯過的代碼緩存起來以降低性能損耗。相對於靜態編譯代碼,即時編譯的代碼可以處理延遲綁定並增強安全性。絕大部分 Python代碼都可以在PyPy下運行,但是PyPy和CPython有一些是不同的。


解釋執行與編譯執行的區別

看到了解釋執行與編譯執行兩個專業詞匯,看着熟悉,但不甚理解,然后在網上搜索了一下。

    對於我們平時寫的代碼,一般計算機是沒辦法直接識別的,需要相應的編譯器將其編譯層機器代碼(一些計算機可以直接識別的二進制代碼),機器才能執行。

    

    編譯執行,顧名思義,要先編譯再執行,這里需要有一個編譯器,來將我們的代碼全部編譯成機器代碼,然后進行執行。因為先整體進行編譯,所以這里會生成編譯后的機器代碼。

    解釋執行,則是需要一個解釋器,它會將我們的一句句解釋成機器代碼來執行,可以認為是,解釋一句,執行一句。在這個過程中,不會生成中間文件。

    通過對比發現,編譯執行,只需要編譯一次,多次運行。而解釋執行的話,每運行一次程序,都要經過解釋器的解釋過程。

   

     針對優缺點,可以從以下幾個方面分析。

    從啟動效率來看,解釋執行不需要進行編譯操作,而編譯執行,要經過編譯過程。解釋執行啟動速度更快。

    從運行效率來看,因為編譯執行只需要編譯一次,以后再運行就無需編譯,而解釋執行每次都要經過解釋過程,所以編譯執行效率更高。

    從內存使用方面來看,編譯執行需要生成編譯后的機器碼文件,而解釋執行時逐句解釋執行,所以解釋執行對內存占用更少。

    從跨平台的角度來看,因為解釋執行每次可以根據不同的平台進行解釋,例如js在linux和windows都可以運行,而C語言在windows下編譯后的文件,只能在windows下才行執行。

     對於大型項目來說,比較注重運行效率,核心代碼一般都是采用編譯執行的語言。而對於一些簡單的操作,可以考慮使用解釋執行的語言。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM