文件
Pyinstrument 是一個 Python 分析器。探查器是一種幫助您優化程式碼的工具 - 使其更快。為了獲得最大的速度提升,您應該專注於程式中最慢的部分。 Pyinstrument幫你找到它!
☕️ 不知道從哪裡開始?查看來自 calamcode.io 的影片教學!
pip install pyinstrument
Pyinstrument 支援 Python 3.8+。
要從 git checkout 運行 Pyinstrument,需要一個建置步驟。請查看貢獻以獲取更多資訊。
若要了解如何使用 pyinstrument 或查看參考,請參閱文件。
pyinstrument script.py
(其中script.py
包含使用pickle
序列化的類別)時,您可能會遇到錯誤,因為序列化機器不知道__main__
在哪裡。請參閱此問題以取得解決方法2024 年 10 月 11 日
HTML 渲染器的大量改進!
時間軸模式 - 檢視並放大互動式線性時間軸!
HTML 模式現在具有互動選項,而不需要預先設定。
簡化了 HTML 頁面標題的設計。
HTML 呼叫堆疊視圖支援箭頭鍵導覽。
檢測“庫”程式碼的方式已更改。以前,如果字串“/lib/”出現在檔案路徑中,則被視為庫程式碼(預設會折疊)。現在,pyinstrument 在設定檔時捕獲 Python 安裝的路徑和任何活動的 virtualenv/conda env。儲存在那裡的文件被視為庫。這應該會減少誤報。
對 profiler.start() 的呼叫現在可以傳遞 target_description 參數,該參數顯示在設定檔讀數中。
請查看我的部落格文章,以了解有關新功能的更多資訊。
2024 年 9 月 6 日
glom
這樣的套件的錯誤,該錯誤會改變 locals() 字典。 (#336)UnicodeDecodeError
的錯誤 (#330)2024 年 8 月 5 日
2024 年 8 月 2 日
2024 年 8 月 1 日
with
區塊或函數/方法裝飾器進行分析。這將分析代碼並將簡短的讀數列印到終端中。 (#327)flat
參數,以呈現一個平面函數清單 (#294)2024 年 1 月 26 日
show_all
選項新增至 Profiler.output_html2023 年 11 月 8 日
%pyinstrument
中不需要的變數擴充的錯誤 (#278)2023 年 10 月 12 日
-c
,允許直接從命令列分析程式碼,例如python -c
。 (#271)Profiler.write_html
,用於將 HTML 輸出直接寫入檔案。 (#266)2023 年 9 月 7 日
2023 年 9 月 1 日
2023 年 7 月 22 日
__tracebackhide__
刪除幀時導致輸出中出現[X frames hidden]
的錯誤 (#255)None
錯誤 (#254)2023 年 6 月 5 日
-p flat
來啟用該模式。此模式顯示透過自時間測量的最重幀,這在某些程式碼庫中可能很有用。 (#240)pstats
檔案的功能。這是 stdlib 中 cprofile 使用的檔案格式。它沒有 pyinstrument 配置那麼詳細,但它與更多工具相容。 (#236)--show-all
選項的細節 - 提供此選項時,pyinstrument 將不再刪除 Python 內部框架。 (#239)2022 年 11 月 5 日
__traceback_hide__
局部變數的訊框現在將從輸出中刪除 (#217)--async_mode=enabled
標誌運行,Jupyter/IPython magic 現在支援 async/await。 (#212)2022 年 8 月 21 日
--interval
(秒,預設 0.001)來更改 pyinstrument 對程式進行採樣的間隔。這對於長時間運行的程式很有用,增加間隔可以減少記憶體開銷。新增命令列選項-p
--render-option
,允許任意設定渲染選項。這允許您透過執行諸如pyinstrument -p processor_options.filter_threshold=0
類的操作,從命令列設定諸如filter_threshold
之類的選項。
以下是該選項的幫助輸出:
-p RENDER_OPTION, --render-option=RENDER_OPTION
options to pass to the renderer, in the format
'flag_name' or 'option_name=option_value'. For
example, to set the option 'time', pass '-p
time=percent_of_total'. To pass multiple options, use
the -p option multiple times. You can set processor
options using dot-syntax, like '-p
processor_options.filter_threshold=0'. option_value is
parsed as a JSON value or a string.
新增了在控制台輸出中以百分比而非絕對時間形式查看時間的功能。使用 ConsoleRenderer 選項time='percent_of_total'
,或在命令列上使用-p
,例如pyinstrument -p time=percent_of_total
。
新增用於載入和儲存 pyinstrument 會話的命令列選項。您可以使用-r session
保存 pyinstrument 會話的原始數據,例如pyinstrument -r session -o session.pyisession myscript.py
。載入是透過--load
進行的,例如pyinstrument --load session.pyisession
。
命令列輸出格式是從-o
輸出檔案副檔名推斷出來的。因此,如果您執行pyinstrument -o profile.html myscript.py
,則無需提供-r html
,pyinstrument 將自動使用 HTML 渲染器。或者,如果您執行pyinstrument -o profile.pyisession myscript.py
,它將保存原始會話物件。
將 FastAPI 和 pytest 的使用範例新增到文件中。
修正了使用async_mode=strict
時導致 NotImplementedError 的錯誤。
新增對 Python 3.11 的支持
%load_ext pyinstrument
,然後在要分析的儲存格中使用%%pyinstrument
。pyinstrument -r speedscope
進行配置,然後上傳到 speedscope Web 應用程式。PYINSTRUMENT_PROFILE_DIR_RENDERER
選項為 Django 中間件檔案輸出配置渲染器。異步支持! Pyinstrument 現在可以偵測非同步任務何時觸發等待,並追蹤在此等待下在非同步上下文之外花費的時間。
例如,這是一個簡單的腳本,其中包含一個執行睡眠操作的非同步任務:
import asyncio
from pyinstrument import Profiler
async def main ():
p = Profiler ( async_mode = 'disabled' )
with p :
print ( 'Hello ...' )
await asyncio . sleep ( 1 )
print ( '... World!' )
p . print ()
asyncio . run ( main ())
在 Pyinstrument 4.0.0 之前,我們只能看到運行循環中花費的時間,如下所示:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:33:03 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.006 CPU time: 0.001
/ _/ v3.4.2
Program: examples/async_example_simple.py
1.006 _run_once asyncio/base_events.py:1784
└─ 1.005 select selectors.py:553
[3 frames hidden] selectors,
1.005 kqueue.control :0
現在,使用 pyinstrument 4.0.0,我們得到:
_ ._ __/__ _ _ _ _ _/_ Recorded: 18:30:43 Samples: 2
/_//_/// /_ / //_// / //_'/ // Duration: 1.007 CPU time: 0.001
/ _/ v4.0.0
Program: examples/async_example_simple.py
1.006 main async_example_simple.py:4
└─ 1.005 sleep asyncio/tasks.py:641
[2 frames hidden] asyncio
1.005 [await]
有關更多信息,請查看非同步分析文件和 Profiler.async_mode 屬性。
Pyinstrument 有一個文件站點,包括完整的 Python API 文件!
--show
、 --show-regex
、 --show-all
在命令列上被忽略的錯誤。output_html()
和open_in_browser()
新增了timeline
選項(布林值)。pyinstrument -m module
的問題,其中 pyinstrument 在目前目錄中找不到模組。Python -> C -> Python
記錄為Python -> Python
,但Python -> Python -> C
將正確歸因。 (#103)<__array_function__ internals>
框架在報表中顯示為應用程式程式碼--show
和--show-regex
選項,以標記要顯示的某些檔案。這有助於分析特定模組的內部情況,同時隱藏其他模組。例如, pyinstrument --show '*/sympy/*' script.py
。Pyinstrument 現在將隱藏您預設使用的程式庫的追蹤。因此,它不會向您顯示大量透過外部內容(例如 urllib)內部的框架,而是讓您專注於程式碼。
前 | 後 |
---|---|
若要返回舊的行為,請在命令列上使用--show-all
。
顯示隱藏群組的「入口」框架,以便您知道哪個呼叫有問題
還顯示了群組中非常慢的幀,例如套接字上的“讀取”調用
應用程式程式碼在控制台中突出顯示
其他指標顯示在追蹤頂部 - 時間戳記、樣本數、持續時間、CPU 時間
隱藏程式碼由--hide
或--hide-regex
選項控制 - 符合程式碼檔案的路徑。
--hide=EXPR glob-style pattern matching the file paths whose
frames to hide. Defaults to '*/lib/*'.
--hide-regex=REGEX regex matching the file paths whose frames to hide.
Useful if --hide doesn't give enough control.
支援從命令列輸出時間軸。
-t, --timeline render as a timeline - preserve ordering and don't
condense repeated calls
因為現在有一些渲染選項,所以您可以使用--load-prev
載入先前的分析會話 - pyinstrument 保留最後 10 個會話。
隱藏群組還可以回調應用程式程式碼,如下所示:
(內部)記錄時間軸時,幀樹現在完全是線性的,允許創建超精確的幀圖表。
(內部)HTML 渲染器已重寫為 Vue.js 應用程式。所有控制台改進也適用於 HTML 輸出,而且它是互動的。
(內部)添加了很多單元和整合測試!
哎呀!請參閱#49 以了解血淋淋的細節。我希望你喜歡它。
Recorders
已移除。幀記錄現在位於Profiler
物件的內部。這意味著「框架」物件更加通用,這為......鋪平了道路。--version
命令列選項新增了對 JSON 輸出的支援。使用pyinstrument --renderer=json scriptfile.py
。公關
@iddan 使用 JSON 輸出組合了一個互動式檢視器!
執行pyinstrument --html
並且不將輸出透過管道傳輸到檔案時,pyinstrument 會將控制台輸出寫入暫存檔案並在瀏覽器中開啟它。
-m
標誌,例如pyinstrument -m module_name
!公關 Pyinstrument 現在可以在with
區塊中使用。
例如:
profiler = pyinstrument.Profiler()
with profiler:
# do some work here...
print(profiler.output_text())
針對舊版 Django 的中間件修復
Pyinstrument 使用新的分析模式。 pyintrument 不使用訊號,而是使用基於 PyEval_SetProfile 建構的新統計分析器。這意味著不再有主執行緒限制,使用 Pyinstrument 時不再出現 IO 錯誤,並且不需要單獨的更多「setprofile」模式!
渲染器。使用者可以自訂 Pyinstrument 以使用Profiler.output()
上的renderer
參數來使用替代渲染器,或在命令列上使用--renderer
參數。
錄音機。為了支援 Pyinstrument 的其他用例(例如火焰圖),pyinstrument 現在具有「時間軸」記錄器模式。此模式以線性方式記錄捕獲的幀,因此可以在時間軸上查看程式執行情況。
pyinstrument
指令。現在,您可以透過執行$ pyinstrument script.py
從 shell 分析 python 腳本。這現在相當於python -m pyinstrument
。謝謝@asmeurer!應用程式程式碼在 HTML 追蹤中突出顯示,以便更容易發現
在 Django 介面中新增了PYINSTRUMENT_PROFILE_DIR
選項,該選項會將所有要求的設定檔記錄到指定資料夾的檔案中。對於分析 API 呼叫很有用。
在 Django 介面中新增了PYINSTRUMENT_USE_SIGNAL
選項,以便在訊號模式出現問題時使用。
設定開發環境:
virtualenv --python=python3 env
. env/bin/activate
pip install --upgrade pip
pip install -r requirements-dev.txt
pre-commit install --install-hooks
要獲得一些範例輸出:
pyinstrument examples/wikipedia_article_word_count.py
運行測試:
pytest
要在本機執行 linting 檢查:
pre-commit run --all-files
一些預提交檢查,例如isort
或black
,將自動修復它們發現的問題。因此,如果上面的命令返回錯誤,請嘗試再次運行它,第二次可能會成功:)
執行所有檢查可能會很慢,因此您也可以單獨執行檢查,例如,格式化未通過isort
或black
檢查的原始程式碼:
pre-commit run --all-files isort
pre-commit run --all-files black
要診斷pyright
檢查失敗的原因:
pre-commit run --all-files pyright
HTML 渲染器的工作原理是將範例的 JSON 表示形式與 Javascript「套件」嵌入到可在任何 Web 瀏覽器中檢視的 HTML 檔案中。
若要編輯 html 渲染器樣式,請執行下列操作:
cd html_renderer
npm ci
npm run serve
當在沒有頂級window.profileSession
物件的情況下啟動時,它將獲取範例配置文件,以便您可以使用它。
要編譯 JS 應用程式並將其捆綁回 pyinstrument python 工具中:
bin/build_js_bundle.py [--force]