VizTracer 是一種低開銷的日誌記錄/偵錯/分析工具,可追蹤和視覺化您的 python 程式碼執行。
前端 UI 由 Perfetto 提供支援。使用“AWSD”縮放/導航。更多幫助可以在“支援 - 控制”中找到。
安裝 VizTracer 的首選方式是透過 pip
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
result.json
文件,您可以使用vizviewer
開啟該文件 # You can display all the files in a directory and open them in browser too
vizviewer ./
# For very large trace files, try external trace processor
vizviewer --use_external_processor result.json
vizviewer 將在http://localhost:9001
上託管一個 HTTP 伺服器。您也可以開啟瀏覽器並使用該位址。
如果您不希望 vizviewer 自動開啟網頁瀏覽器,您可以使用
vizviewer --server_only result.json
如果您只需要調出追蹤報告一次,並且不需要持久性伺服器,請使用
vizviewer --once result.json
vizviewer result.json
VS Code 擴充功能可以讓您的生活變得更輕鬆。
--open
以在跟踪後立即打開報告viztracer --open my_script.py arg1 arg2
viztracer -o result.html --open my_script.py arg1 arg2
flask
) viztracer -m your_module
viztracer flask run
您也可以在腳本中手動啟動/停止 VizTracer。
from viztracer import VizTracer
tracer = VizTracer ()
tracer . start ()
# Something happens here
tracer . stop ()
tracer . save () # also takes output_file as an optional argument
或者,您可以使用with
語句來做到這一點
with VizTracer ( output_file = "optional.json" ) as tracer :
# Something happens here
如果您使用 Jupyter,則可以使用 viztracer cell magics。
# You need to load the extension first
% load_ext viztracer
% % viztracer
# Your code after
單元格後面將出現一個VizTracer Report
按鈕,您可以單擊它來查看結果
VizTracer 可以使用--log_torch
記錄 PyTorch (基於torch.profiler
)的本機呼叫和 GPU 事件。
with VizTracer ( log_torch = True ) as tracer :
# Your torch code
viztracer --log_torch your_model.py
VizTracer 可以過濾掉您不想要的數據,以減少開銷並在轉儲日誌之前保留較長時間段的資訊。
VizTracer 可以在不更改原始程式碼的情況下記錄額外資訊
VizTracer 支援在程式執行時插入自訂事件。這與列印偵錯類似,但您可以在查看追蹤資料時知道列印何時發生。
對於Python3.12+,VizTracer支援Python層級的多執行緒跟踪,無需對程式碼進行任何修改。
對於3.12之前的版本,VizTracer支援python原生threading
模組。只需在創建線程之前啟動VizTracer
,它就會正常工作。
對於其他多執行緒場景,您可以使用enable_thread_tracing()
來通知VizTracer有關執行緒的資訊以對其進行追蹤。
詳細資訊請參閱多線程文檔
VizTracer 開箱即用支援subprocess
、 multiprocessing
、 os.fork()
、 concurrent.futures
和loky
。
對於更一般的多進程情況,VizTracer 可以支援一些額外的步驟。
有關詳細信息,請參閱多進程文檔
VizTracer 本身支援asyncio
,但可以透過使用--log_async
來增強報表。
有關詳細信息,請參閱非同步文檔
Perfetto 支援原生火焰圖,只需在 UI 上選擇切片並選擇「切片火焰圖」即可。
VizTracer 支援遠端連接到任意 Python 進程來追蹤它,只要 viztracer 是可導入的
請參閱遠端連線文檔
VizTracer需要將內部資料轉儲為json格式。推薦用戶安裝orjson
,它比內建的json
庫快得多。 VizTracer 將嘗試導入orjson
,如果orjson
不存在,則回退到內建json
庫。
VizTracer 投入了大量精力來實現低開銷。實際的效能影響很大程度上取決於您的應用程式。對於典型的程式碼庫,開銷預計低於 1 倍。如果您的程式碼不頻繁呼叫函數,則開銷可能會很小。
VizTracer 引入的開銷基本上是函數進入和退出期間的固定時間量,因此函數進入和退出花費的時間越多,觀察到的開銷就越多。純遞歸fib
函數在 Python3.11+ 上可能會遭受 3 倍到 4 倍的開銷(當優化 Python 呼叫時,先前的 Python 呼叫速度較慢,因此開銷比率會更少)。
在現實生活中,您的程式碼不應該在函數呼叫上花費太多時間(它們實際上並沒有做任何有用的事情),因此開銷會小得多。
應用了許多技術來最大限度地減少程式碼執行期間的整體開銷,以減少 VizTracer 引入的不可避免的偏差(報告保存部分並不那麼重要)。例如,VizTracer 嘗試使用 CPU 時間戳計數器而不是系統呼叫來取得可用時間。在 Python 3.12+ 上,VizTracer 使用sys.monitoring
,其開銷比sys.setprofile
更少。所有這些努力都使其明顯比 Python stdlib 分析器cProfile
更快。
然而,VizTracer 是一個追蹤器,這意味著它必須記錄每個函數的進入和退出,因此它不能像採樣分析器一樣快 - 它們不是同一件事。由於額外的開銷,VizTracer 提供了比普通採樣分析器更多的資訊。
有關完整文檔,請參閱 https://viztracer.readthedocs.io/en/stable
請透過 github 問題追蹤器發送錯誤報告和功能請求。 VizTracer 目前正在開發中,歡迎任何建設性建議。
版權所有 2020-2024 天高。
根據 Apache 2.0 授權條款分發。