使用 airspeed velocity 評測 SciPy#

本文檔介紹基準評測,包括線上檢閱 SciPy 基準測試結果、編寫基準測試,以及在本機執行基準測試。如需編寫測試和在本機執行的影片演練,請參閱 Benchmarking SciPy

airspeed velocity (asv) 文件 中所述

Airspeed velocity (asv) 是一種用於在 Python 套件的生命週期內進行基準評測的工具。可以追蹤執行時間、記憶體消耗,甚至自訂計算的值。結果會顯示在互動式 Web 前端中,該前端僅需要基本靜態 Web 伺服器來託管。

若要了解這表示什麼,請查看 未負載 scipy 的 airspeed velocity。每個圖表都會摘要專案提交歷史記錄中特定測試的執行時間;也就是說,當每個提交合併時,會執行基準測試、測量其執行時間,並繪製經過的時間。除了追蹤程式碼的效能之外,提交旨在影響,針對每個提交執行所有基準測試有助於識別非預期的效能退步:一個或多個基準測試的執行時間顯著增加。由於 SciPy 是相互關聯的程式碼網路,因此小變更的影響可能不會立即對貢獻者顯而易見,因此此基準測試套件使其更容易偵測效能退步並識別導致效能退步的提交。當您貢獻重要的新功能時,或注意到某個功能尚未進行基準測試時,請考慮編寫基準測試。

編寫基準測試#

airspeed velocity 文件的 編寫基準測試 章節是編寫基準測試的權威指南。另請參閱 SciPy 基準測試讀我檔案

若要了解如何編寫基準測試,請查看 scipy/benchmarks/benchmarks/optimize_linprog.pyBenchmark 的每個子類別都會定義一個基準測試。例如,KleeMinty 類別定義了一個基準測試,該測試基於 Klee-Minty 超立方體問題,這是針對線性規劃單體演算法的棘手測試。該類別包含四個部分

  • setup 準備要執行的基準測試。此函式的執行時間計入基準測試結果中,因此這是設定定義問題的所有變數的好地方。在 KleeMinty 範例中,這涉及產生與 dims 維度中的 Klee-Minty 超立方體對應的陣列 cA_ubb_ub,並將它們儲存為執行個體變數。

  • time_klee_minty 實際執行基準測試。此函式在 KleeMinty 物件已實例化且 setup 已執行後執行,因此它會從 self 取得定義問題的陣列。請注意,函式名稱中的字首 timeasv 指示此函式的執行時間計入基準測試結果中。

  • params 是定義測試參數的清單的清單。基準測試會針對這些參數的所有可能組合執行。例如,第一次執行基準測試時,methods (simplex) 的第一個元素會作為第一個引數 meth 傳遞到 setuptime_klee_minty,而 [3, 6, 9] (3) 的第一個元素會作為第二個引數 dims 傳遞到 setuptime_klee_minty。下次執行基準測試時,會將 revised simplex6 作為引數傳遞給 setuptime_klee_minty,依此類推,直到使用參數的所有組合。

  • param_namesparams 清單中每個元素的人性化可讀名稱的清單。這些名稱用於呈現結果。

過去幾年此基準測試的結果可透過按一下 KleeMinty.time_klee_minty 連結在 未負載 scipy 的 airspeed velocity 中取得。請注意,圖表的每個追蹤線都對應於基準測試參數和環境設定(例如,Cython 版本)的組合,並且可以使用左側的控制面板切換追蹤線的可見性。

在本機執行基準測試#

在開始之前,請確保已安裝 airspeed velocity

在貢獻新的基準測試之後,您應該在本機測試它們,然後再提交提取請求。

若要執行所有基準測試,請在命令列導覽至根 SciPy 目錄並執行

python dev.py bench

其中 bench 會啟動基準測試套件而不是測試套件。這會建置 SciPy 並執行基準測試。(注意:這可能需要一段時間。基準測試通常比單元測試花費更長的時間執行,並且每個基準測試都會執行多次以測量執行時間的分佈。

若要從特定基準測試模組(例如 optimize_linprog.py)執行基準測試,只需附加不含副檔名的檔案名稱

python dev.py bench -t optimize_linprog

若要執行在類別中定義的基準測試,例如 optimize_linprog.py 中的 KleeMinty

python dev.py bench -t optimize_linprog.KleeMinty

若要比較活動分支與另一個分支(例如 main)之間的基準測試結果

python dev.py bench --compare main  # select again by `-t optimize_linprog`

上述所有命令都會在主控台中以純文字顯示結果,並且不會儲存結果以與未來的提交進行比較。為了獲得更大的控制、圖形化檢視,以及儲存結果以供未來比較,您可以直接使用 asv 終端機指令。

若要使用它,請在主控台中導覽至 scipy/benchmarks,然後執行

asv run

此命令會執行整個基準測試套件,並儲存結果以與未來的提交進行比較。

若要僅執行單一基準測試,例如 optimize_linprog.py 中的 KleeMinty

asv run --bench optimize_linprog.KleeMinty

asv 的一項絕佳功能是,它不僅可以針對目前的提交自動執行基準測試,還可以針對範圍內的每個提交自動執行基準測試。linprog method='interior-point' 已與提交 7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32 合併到 SciPy 中,因此讓我們針對那時到現在之間的 10 個提交執行 KleeMinty 基準測試,以追蹤其隨時間的效能

asv run --bench optimize_linprog.KleeMinty --steps 10 7fa17f..

注意

這會花費一段時間,因為必須針對每個提交重建 SciPy!若要加速基準測試的建置過程,您可以安裝 ccachef90cache。如果基準測試套件安裝在 /usr/lib/usr/local/lib 中,則會自動偵測到它們。否則,您必須將它們新增至 PATH 環境變數。

如需有關指定提交範圍的詳細資訊,請參閱 git 修訂文件

若要「發佈」結果(準備檢視)並在互動式主控台中「預覽」結果

asv publish
asv preview

ASV 將報告它正在執行伺服器。使用任何瀏覽器,您可以透過導覽至 http://127.0.0.1:8080 (本機,連接埠 8080)來檢閱結果。

如需有關 asv 指令的更多資訊,請參閱 airspeed velocity Commands 文件。(提示:查看 asv find 指令和 asv run--quick--skip-existing-commits--profile 選項。)