PythonGIL 中的自由線程模式已停用)
Python 3.13 最近剛發布,具有一個令人驚嘆的新功能,稱為「自由執行緒模式」。當您使用線程時,這對於程式碼的效能來說是一個很大的改進。本文展示如何啟用此功能(預設不啟用)並展示「自由執行緒模式」對程式碼效能的影響。
安裝免費線程Python
Windows 和 MacOS 用戶
對於 Windows 和 MacOS 用戶,只需從 Python 網站下載最新的安裝程式即可。當您安裝Python時,當您選擇「自訂安裝」選項時,會有一個啟用「自由執行緒模式」的複選框。
Ubuntu 用戶
對於 Ubuntu 用戶,您可以透過在終端機中執行以下命令來啟用此功能:
sudo add-apt-repository ppa:deadsnakes sudo apt-get update sudo apt-get install python3.13-nogil
驗證自由線程模式已啟用
安裝套件後,您可以使用 python3.13(原始)和 python3.13-nogil 或 python3.13t(免費線程 Python)運行程式碼。
請參閱這篇文章,以了解有關如何在 Linux 發行版上安裝 Python 3.13 實驗版的更多詳細資訊。
要驗證您的 Python 是否啟用了“自由執行緒模式”,您可以使用以下命令:
python3.13t -VV Python 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0]
自由線程模式效能
實驗設定
讓我們看看自由執行緒模式對下面簡單程式碼的影響:
- 我有一個函數工作者,它執行一些計算並傳回 0 到 1000 萬之間的數字總和。
- 我有「測試 1」來按順序運行工作函數 5 次。
- 我有「測試 2」來使用多個執行緒並行運行工作函數,執行緒數為 5。
- 我確實測量了這兩個測試的執行時間。
import sys import threading import time print("Python version : ", sys.version) def worker(): sum = 0 for i in range(10000000): sum += i n_worker = 5 # Single thread start = time.perf_counter() for i in range(n_worker): worker() print("Single Thread: ", time.perf_counter() - start, "seconds") # Multi thread start = time.perf_counter() threads = [] for i in range(n_worker): t = threading.Thread(target=worker) threads.append(t) t.start() for t in threads: t.join() print("Multi Thread: ", time.perf_counter() - start, "seconds")
稍後,我將使用普通 Python(python3.13 二進位檔案)和免費線程 Python(pypy3.13t 二進位檔案)運行此程式碼。
結果
首先,使用python3.13運行測試:
python3.13 gil_test.py Python version : 3.13.0 (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.4370562601834536 seconds Multi Thread: 1.3681392602156848 seconds
然後,使用 pypy3.13t 執行測試:
python3.13t gil_test.py Python version : 3.13.0 experimental free-threading build (main, Oct 8 2024, 08:51:28) [GCC 11.4.0] Single Thread: 1.862126287072897 seconds Multi Thread: 0.3931183419190347 seconds
我也嘗試使用 python3.11:
python3.11 gil_test.py Python version : 3.11.3 (main, Apr 25 2023, 16:40:23) [GCC 11.3.0] Single Thread: 1.753435204969719 seconds Multi Thread: 1.457715731114149 seconds
結果分析
Python預設有GIL(Global Interpreter Lock)鎖定機制,使得多執行緒其實並不是並行的。可以看到單線程的時間處理和多線程類似。
使用python3.11t(自由執行緒模式),多執行緒效能比單執行緒快很多。所以,多執行緒現在實際上是並行的。
但是,你有沒有發現 python3.13t 中的單執行緒測驗比 pypy3.13 慢一點?
我不太明白為什麼,所以如果你有任何解釋請告訴我。
結論
我認為在python中使用多執行緒進行並行處理是很好的。但是,如果沒有GIL鎖定機制,則需要開發人員注意“線程安全”,即。在執行緒之間共享資料。
此外,我們需要等待函式庫和套件更新才能完全支援自由執行緒模式。這就是為什麼現在預設不啟用“自由線程模式”的原因之一。但是,我認為這將是未來的一個很好的功能。
以上是PythonGIL 中的自由線程模式已停用)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

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

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

Stock Market GPT
人工智慧支援投資研究,做出更明智的決策

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

運行pipinstall-rrequirements.txt可安裝依賴包,建議先創建並激活虛擬環境以避免衝突,確保文件路徑正確且pip已更新,必要時使用--no-deps或--user等選項調整安裝行為。

本教程詳細介紹瞭如何將PEFT LoRA適配器與基礎模型高效合併,生成一個完全獨立的模型。文章指出直接使用transformers.AutoModel加載適配器並手動合併權重是錯誤的,並提供了使用peft庫中merge_and_unload方法的正確流程。此外,教程還強調了處理分詞器的重要性,並討論了PEFT版本兼容性問題及解決方案。

Pytest是Python中簡單強大的測試工具,安裝後按命名規則自動發現測試文件。編寫以test_開頭的函數進行斷言測試,使用@pytest.fixture創建可複用的測試數據,通過pytest.raises驗證異常,支持運行指定測試和多種命令行選項,提升測試效率。

theargparsemodulestherecommondedwaywaytohandlecommand-lineargumentsInpython,提供式刺激,typeValidation,helpmessages anderrornhandling; useSudys.argvforsimplecasesRequeRequeRingminimalSetup。

本文旨在探討Python及NumPy中浮點數計算精度不足的常見問題,解釋其根源在於標準64位浮點數的表示限制。針對需要更高精度的計算場景,文章將詳細介紹並對比mpmath、SymPy和gmpy等高精度數學庫的使用方法、特點及適用場景,幫助讀者選擇合適的工具來解決複雜的精度需求。

PyPDF2、pdfplumber和FPDF是Python處理PDF的核心庫。使用PyPDF2可進行文本提取、合併、拆分及加密,如通過PdfReader讀取頁面並調用extract_text()獲取內容;pdfplumber更適合保留佈局的文本提取和表格識別,支持extract_tables()精準抓取表格數據;FPDF(推薦fpdf2)用於生成PDF,通過add_page()、set_font()和cell()構建文檔並輸出。合併PDF時,PdfWriter的append()方法可集成多個文件

Import@contextmanagerfromcontextlibanddefineageneratorfunctionthatyieldsexactlyonce,wherecodebeforeyieldactsasenterandcodeafteryield(preferablyinfinally)actsas__exit__.2.Usethefunctioninawithstatement,wheretheyieldedvalueisaccessibleviaas,andthesetup

獲取當前時間在Python中可通過datetime模塊實現,1.使用datetime.now()獲取本地當前時間,2.用strftime("%Y-%m-%d%H:%M:%S")格式化輸出年月日時分秒,3.通過datetime.now().time()獲取僅時間部分,4.推薦使用datetime.now(timezone.utc)獲取UTC時間,避免使用已棄用的utcnow(),日常操作以datetime.now()結合格式化字符串即可滿足需求。
