搜尋
首頁後端開發Python教學Python 的內部運作原理

Internal Working Of Python

這是完整的程式碼檔案:程式碼

1.原始碼

當您編寫 Python 腳本時,它是人類可讀的文字。這個原始碼是一切的起點。

您的 Python 原始碼以 .py 檔案編寫,是人類可讀的。此程式碼定義了程式的功能,指定變數、函數、迴圈等。

2.編譯為字節碼(編譯器)

當你執行Python程式時,第一步是將原始碼編譯為字節碼。這是由 Python 解釋器完成的:

  • 語法檢查:確保沒有語法錯誤。
  • 編譯:將高階原始碼轉換為字節碼,這是一種較低階的、與平台無關的表示形式。該字節碼通常駐留在 __pycache__ 目錄中的 .pyc 檔案中。
    • 編譯器:Python 使用解釋器,但它首先將原始程式碼編譯為稱為字節碼的較低層級形式。
  • 標記化:將程式碼分解為稱為標記的小塊(如關鍵字、運算子、識別碼)。
  • 解析:分析標記以確保它們遵循 Python 的語法規則。
  • 控制流程圖(CFG):表示程式在執行過程中可能遍歷的所有路徑。
  • 字節碼產生:將解析後的令牌轉換為字節碼,這是Python虛擬機器(PVM)的一組指令。

Internal Working Of Python

讓我們深入探討一下。

Python 編譯器:儘管 Python 被稱為解釋性語言,但它確實有一個編譯步驟。詳細內容如下:

標記化

  • 將程式碼分解為稱為標記的小塊(如關鍵字、運算子、識別碼)。
  1. 原始碼:從您編寫的程式碼開始。
  2. 分詞器(Lexer):這會將原始碼分解為稱為標記的較小部分,例如關鍵字(for、if)、運算子(、-)、識別碼(變數名稱)和文字(例如數字或字串) .
  3. 解析:分析標記以確保它們遵循 Python 的語法規則。
  4. 語法分析:解析器取得這些標記並根據 Python 的語法規則檢查它們。
  5. 解析樹:從標記建構樹結構,表示程式碼的語法結構。
  6. 語意分析:確保程式碼在資料類型、範圍和其他特定於上下文的規則方面有意義。
  7. 控制流程圖(CFG):表示程式在執行過程中可能遍歷的所有路徑。
    • 控制流程圖:表示程式碼執行過程中可能採取的所有可能路徑。
    • 節點和邊:每個節點代表一個基本程式碼區塊,邊代表從一個區塊到另一個區塊的控制流。
  8. 字節碼產生:將解析後的令牌轉換為字節碼,這是Python虛擬機器(PVM)的一組指令。
    • 字節碼是原始程式碼的更緊湊、較低層級的表示形式,並針對執行進行了最佳化。它獨立於平台,這意味著它可以在任何具有相容 PVM 的系統上運行。
    • 字節碼:解析後的程式碼轉換為字節碼,一種較低階的、與平台無關的表示。
    • 指令集:此字節碼是Python虛擬機器(PVM)可以執行的一組指令。字節碼儲存在 __pycache__ 目錄中的 .pyc 檔案中,以加快將來的執行速度。

3.載入字節碼(字節碼)

編譯後,Python 虛擬機器載入字節碼:

  • 從快取讀取:如果字節碼之前已編譯且未更改,則從快取(__pycache__)讀取。這透過跳過編譯步驟來加快執行速度。
    • 字節碼已載入到記憶體中,準備執行。然後字節碼由 PVM 執行,解釋指令以執行程式的任務。

4.由 PVM (PVM) 執行

PVM 現在解釋並執行字節碼:

  • 指令執行:PVM 讀取每個字節碼指令並執行它。每條指令對應一個特定的操作,例如載入值、執行算術或呼叫函數。
  • 記憶體管理:管理變數和物件的記憶體分配和釋放。

Python 中的記憶體管理:

  1. 引用計數:Python 追蹤記憶體中物件的引用數量。當引用計數降至零時,可以回收該物件所佔用的記憶體。
  2. 物件分配:程式碼在運行時在記憶體中建立 Python 物件(如整數、字串、列表)。
  3. 垃圾收集:Python 有一個垃圾收集器,它透過釋放不再使用的記憶體(即引用計數為零的物件)來幫助管理記憶體。
  4. 記憶體池:Python 使用記憶體池來更有效地分配小物件。這種池化有助於減少頻繁分配和釋放小塊記憶體的開銷。
  5. 記憶體最佳化:Python 應用各種最佳化來最小化記憶體使用,例如:
    • PVM 執行各種執行時間最佳化以提高效率,例如某些實作(如 PyPy)中的即時 (JIT) 編譯。
    • 重複使用小整數和內部字串。
    • 有效管理資料結構(例如元組、列表、字典)。

範例

  • 字節碼快取:PVM 快取已編譯的字節碼,以避免每次都重新編譯原始碼。這會加快後續運轉的速度。
  • 常數折疊:這涉及在編譯時而不是運行時簡化常數表達式。例如,3 * 2 可能會預先計算為 6。

所以,總而言之:PVM 就像一個管弦樂團指揮,無縫地將字節碼轉換為電腦可以執行的操作。它的美妙之處在於,由於 PVM,Python 程式碼是可移植的,無需修改即可在不同平台上運行。

我們如何查看字節碼是否產生?

導入Python模組時,Python會將原始碼編譯為位元組碼並將其儲存在__pycache__目錄中。這有助於加快未來的導入速度,避免每次導入時都需要重新編譯模組。

流程如下:

  • 首次導入:首次導入模組時,Python 會將 .py 檔案編譯為字節碼。
  • pycache 目錄:字節碼儲存在 __pycache__ 目錄中,名稱類似 module_name.cpython-312.pyc。 # 312 是 Python 版本。
  • 後續導入:在後續導入時,Python 會檢查 __pycache__ 目錄中是否有已編譯的字節碼,如果源代碼未更改,則使用它,從而加快導入過程。

例子:

我們有 byte.py。當我們在執行 byte.py 後從 hello_world.py 導入程式碼時,我們可以看到該特定資料夾中會有一個目錄 __pycache__ ,我們可以看到 .pyc 檔案:

from hello_world import greet

greet("Byte code")


透過使用 py_compile

py_compile模組,它允許你將Python原始檔編譯成字節碼檔。這是一種加快未來運行腳本執行速度的便捷方法。

在 byte.py 中

import py_compile

py_compile.compile('hello_world.py')

  • py_compile 模組將 hello_world.py 編譯為字節碼。
  • 產生的字節碼儲存在 pycache 目錄中,建立一個名為 hello_world.cpython-38.pyc (或類似文件,取決於您的 Python 版本)的檔案。

產生字節碼:

  • 執行整個腳本來產生字節碼。這意味著任何頂級程式碼(例如 print("Hello, World!") 和 print("c"))都會在編譯過程中執行。

產生的字節碼:

  • 字節碼包含所有函數、類別和可執行語句,Python 使用它們來加速未來腳本的導入。

顯示模組

Python 中的 dis 模組用於將字節碼反組譯成更易讀的形式。這可以幫助您了解 Python 程式碼在幕後的用途。它對於調試或了解 Python 的內部結構特別有用。

  • 在internal.py中我們有
from hello_world import greet

greet("Byte code")


輸出

import py_compile

py_compile.compile('hello_world.py')

  • 程式首先導入 dis 模組,這是一個用於分析 CPython 字節碼的強大工具。 CPython 是 Python 的預設實現,字節碼是 Python 解釋器的中間語言。
  • 接下來,我定義了一個名為greet的簡單函數。此函數接受參數名稱並列印出問候語。儘管函數本身非常簡單,但 Python 底層發生的事情比表面上看起來更複雜。
  • disassemble_function 函數使用 dis.dis() 來反組譯greet函數。 dis.dis() 將 Python 函數轉換為 Python 虛擬機器實際執行的低階位元組碼。這個字節碼是Python對greet函數的解釋,更接近機器碼。
  • 當腳本呼叫 disassemble_function() 時,控制台輸出顯示我們的greet 函數的字節碼。

這是字節碼告訴我們的內容:

  • LOAD_GLOBAL(0):此操作碼用於載入全域變量,在本例中是列印函數。
  • LOAD_CONST(1):這會將常數值「Hello,」載入到堆疊上。
  • LOAD_FAST(0):此操作碼將局部變數名稱載入到堆疊上。
  • FORMAT_VALUE(0):這會格式化我們的名稱字串,準備將其插入即將建置的字串中。
  • BUILD_STRING(2):這採用堆疊上的前兩個值(「Hello,」和名稱)並建立最終字串。
  • CALL_FUNCTION(1):這一行呼叫函數(我們載入到堆疊上的全域列印函數),參數計數位於括號中(我們有一個參數,即我們的格式化字串)。
  • POP_TOP:這會刪除堆疊頂部(上一次呼叫的結果,因為 print 傳回 None)。
  • LOAD_CONST(0):不載入。
  • RETURN_VALUE:這是greet函數的回傳值,由於沒有明確的return語句,因此為None。
  • 本質上,字節碼顯示了Python執行我們的greet函數時執行的各個操作。理解這些指令對於開發人員理解 Python 如何執行程式碼、最佳化函數和管理資源至關重要 - 當我們運行 Python 程式碼時,所有這些都在幕後無縫地發生。

這不是一次令人愉快地深入 Python 機房的經歷嗎?繼續編碼並繼續探索該語言引擎室的深度? !

以上是Python 的內部運作原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
python中兩個列表的串聯替代方案是什麼?python中兩個列表的串聯替代方案是什麼?May 09, 2025 am 12:16 AM

可以使用多種方法在Python中連接兩個列表:1.使用 操作符,簡單但在大列表中效率低;2.使用extend方法,效率高但會修改原列表;3.使用 =操作符,兼具效率和可讀性;4.使用itertools.chain函數,內存效率高但需額外導入;5.使用列表解析,優雅但可能過於復雜。選擇方法應根據代碼上下文和需求。

Python:合併兩個列表的有效方法Python:合併兩個列表的有效方法May 09, 2025 am 12:15 AM

有多種方法可以合併Python列表:1.使用 操作符,簡單但對大列表不內存高效;2.使用extend方法,內存高效但會修改原列表;3.使用itertools.chain,適用於大數據集;4.使用*操作符,一行代碼合併小到中型列表;5.使用numpy.concatenate,適用於大數據集和性能要求高的場景;6.使用append方法,適用於小列表但效率低。選擇方法時需考慮列表大小和應用場景。

編譯的與解釋的語言:優點和缺點編譯的與解釋的語言:優點和缺點May 09, 2025 am 12:06 AM

CompiledLanguagesOffersPeedAndSecurity,而interneterpretledlanguages provideeaseafuseanDoctability.1)commiledlanguageslikec arefasterandSecureButhOnderDevevelmendeclementCyclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesclesandentency.2)cransportedeplatectentysenty

Python:對於循環,最完整的指南Python:對於循環,最完整的指南May 09, 2025 am 12:05 AM

Python中,for循環用於遍歷可迭代對象,while循環用於條件滿足時重複執行操作。 1)for循環示例:遍歷列表並打印元素。 2)while循環示例:猜數字遊戲,直到猜對為止。掌握循環原理和優化技巧可提高代碼效率和可靠性。

python concatenate列表到一個字符串中python concatenate列表到一個字符串中May 09, 2025 am 12:02 AM

要將列表連接成字符串,Python中使用join()方法是最佳選擇。 1)使用join()方法將列表元素連接成字符串,如''.join(my_list)。 2)對於包含數字的列表,先用map(str,numbers)轉換為字符串再連接。 3)可以使用生成器表達式進行複雜格式化,如','.join(f'({fruit})'forfruitinfruits)。 4)處理混合數據類型時,使用map(str,mixed_list)確保所有元素可轉換為字符串。 5)對於大型列表,使用''.join(large_li

Python的混合方法:編譯和解釋合併Python的混合方法:編譯和解釋合併May 08, 2025 am 12:16 AM

pythonuseshybridapprace,ComminingCompilationTobyTecoDeAndInterpretation.1)codeiscompiledtoplatform-Indepententbybytecode.2)bytecodeisisterpretedbybythepbybythepythonvirtualmachine,增強效率和通用性。

了解python的' for”和' then”循環之間的差異了解python的' for”和' then”循環之間的差異May 08, 2025 am 12:11 AM

theKeyDifferencesBetnewpython's“ for”和“ for”和“ loopsare:1)” for“ loopsareIdealForiteringSequenceSquencesSorkNowniterations,而2)”,而“ loopsareBetterforConterContinuingUntilacTientInditionIntionismetismetistismetistwithOutpredefinedInedIterations.un

Python串聯列表與重複Python串聯列表與重複May 08, 2025 am 12:09 AM

在Python中,可以通過多種方法連接列表並管理重複元素:1)使用 運算符或extend()方法可以保留所有重複元素;2)轉換為集合再轉回列表可以去除所有重複元素,但會丟失原有順序;3)使用循環或列表推導式結合集合可以去除重複元素並保持原有順序。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境