如果解釋Python,什么是.pyc文件?


我已經了解Python是一種解釋型語言......但是,當我查看我的Python源代碼時,我看到.pyc文件,Windows將其識別為“編譯的Python文件”。 這些來自哪里?


#1樓

Python代碼經歷了兩個階段。 第一步將代碼編譯成.pyc文件,這實際上是一個字節碼。 然后使用CPython解釋器解釋此.pyc文件(字節碼)。 請參閱此鏈接。 這里用簡單的術語解釋代碼編譯和執行的過程。


#2樓

它們包含字節代碼 ,這是Python解釋器編譯源的代碼。 然后,此代碼由Python的虛擬機執行。

Python的文檔解釋了這樣的定義:

Python是一種解釋型語言,與已編譯的語言相反,盡管由於字節碼編譯器的存在,區別可能很模糊。 這意味着可以直接運行源文件,而無需顯式創建隨后運行的可執行文件。


#3樓

這些是由Python解釋器在導入.py文件時創建的,它們包含導入的模塊/程序的“編譯字節碼”,其思想是從源代碼到字節碼的“轉換”(只需要完成)如果.pyc比相應的.py文件更新,則可以在后續import跳過一次,從而加快啟動速度。 但它仍然被解釋。


#4樓

我已經理解Python是一種解釋語言......

這種流行的模因是不正確的,或者更確切地說,是基於對(自然)語言水平的誤解而構建的:類似的錯誤就是說“聖經是精裝書”。 讓我解釋一下比喻......

“聖經”是“一本書”,意思是成為一類 (實際的,物理對象)書籍; 被確定為“聖經副本”的書籍應該具有一些基本的共同點(內容,即使是那些可以使用不同語言,具有不同的可接受翻譯,腳注和其他注釋的水平) - 然而,這些書籍是很好地允許在被認為是基本的無數方面有所區別 - 綁定的種類,綁定的顏色,打印中使用的字體,插圖(如果有的話),寬的可寫邊距,內置書簽的數量和種類, 等等等等。

很有可能的是,聖經的典型印刷確實是精裝書 - 畢竟,它是一本通常意味着一遍又一遍地閱讀的書,在幾個地方加書簽,翻閱尋找給定的章節和詩句指針等等,一個好的精裝書綁定可以使給定的副本在這種使用下持續更長時間。 然而,這些是平凡的(實際的)問題,不能用於確定給定的實際書籍對象是否是聖經的副本:平裝印刷是完全可能的!

類似地,Python是定義一類語言實現的 “語言”,它必須在某些基本方面都是相似的(語法,大多數語義,除了那些明確允許它們不同的那些部分)但完全允許幾乎每個“實現”細節都有所不同 - 包括他們如何處理他們給出的源文件,他們是否將源代碼編譯成某種較低級別的形式(如果是,那么哪種形式 - 以及他們是否保存這些形式編譯表格,磁盤或其他地方),他們如何執行所述表格,等等。

經典實現CPython通常簡稱為“Python” - 但它只是幾個生產質量實現中的一個,與Microsoft的IronPython(編譯為CLR代碼,即“.NET”)並列,Jython (編譯為JVM代碼),PyPy(用Python本身編寫,可以編譯成各種各樣的“后端”形式,包括“即時”生成的機器語言)。 它們都是Python(==“Python語言的實現”),就像許多表面上不同的書籍對象都可以是聖經(==“聖經的副本”)。

如果你對CPython特別感興趣:它將源文件編譯成特定於Python的低級表單(稱為“字節碼”),在需要時自動執行(當沒有與源文件對應的字節碼文件時,或者字節碼文件比源文件舊,或由不同的Python版本編譯),通常將字節碼文件保存到磁盤(以避免將來重新編譯它們)。 OTOH IronPython通常會編譯為CLR代碼(將它們保存到磁盤或不依賴)和Jython保存到JVM代碼(將它們保存到磁盤或不保存 - 如果保存它們將使用.class擴展名)。

然后,這些較低級別的表單由適當的“虛擬機”(也稱為“解釋器”)執行 - CPython VM,.Net運行時,Java VM(也稱為JVM)。

因此,從這個意義上來說(典型的實現是做什么的),當且僅當C#和Java是:所有這些都具有首先生成字節碼的典型實現策略,然后通過VM /解釋器執行它時,Python是一種“解釋語言” 。

更有可能的焦點是編譯過程的“重”,慢和高儀式。 CPython旨在盡可能快地編譯,盡可能輕量級,盡可能少的儀式 - 編譯器執行非常少的錯誤檢查和優化,因此它可以快速運行並且在少量內存中運行,這樣就可以了可以在需要時自動且透明地運行,而無需用戶甚至需要知道正在進行編譯,大多數情況下。 Java和C#通常在編譯期間接受更多工作(因此不執行自動編譯),以便更徹底地檢查錯誤並執行更多優化。 它是灰度級的連續體,而不是黑色或白色的情況,並且將閾值置於某個給定的水平並且僅在該級別之上將其稱為“編譯”將是完全隨意的! - )


#5樓

Python(至少是它最常見的實現)遵循將原始源代碼編譯為字節代碼,然后解釋虛擬機上的字節代碼的模式。 這意味着(同樣,最常見的實現)既不是純解釋器也不是純編譯器。

然而,另一方面,編譯過程大多是隱藏的 - .pyc文件基本上被視為緩存; 他們加快了速度,但你通常根本不需要了解它們。 它會根據文件時間/日期戳自動使其無效並重新加載(重新編譯源代碼)。

大約在我看到這個問題的唯一一次是當編譯的字節碼文件以某種方式在未來很好地獲得時間戳時,這意味着它總是看起來比源文件更新。 由於它看起來更新,源文件從未被重新編譯,所以無論你做了什么改變,它們都會被忽略......

來源:http://www.1994july.club/seo/?p=1685


免責聲明!

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



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