NumPy 效能基準測試#

使用 Airspeed Velocity 基準測試 NumPy。

用法#

Airspeed Velocity 會自行管理建置和 Python 虛擬環境,除非另有指示。要執行基準測試,您不需要在目前的 Python 環境中安裝 NumPy 的開發版本。

在開始之前,請確保已安裝airspeed velocity。預設情況下,asv 隨附支援 anaconda 和 virtualenv

pip install asv
pip install virtualenv

在貢獻新的基準測試之後,您應該在提交 pull request 之前先在本機測試它們。

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

spin bench

這會建置 NumPy 並執行 benchmarks/ 中定義的所有可用基準測試。(注意:這可能需要一段時間。每個基準測試都會執行多次,以測量執行時間的分佈。)

對於在本機測試基準測試,最好在不重複的情況下執行這些測試

cd benchmarks/
export REGEXP="bench.*Ufunc"
asv run --dry-run --show-stderr --python=same --quick -b $REGEXP

其中用於比對基準測試的正規表示式儲存在 $REGEXP 中,而 –quick 則用於避免重複。

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

spin bench -t bench_core

若要執行在類別中定義的基準測試,例如來自 bench_creation.pyMeshGrid

spin bench -t bench_creation.MeshGrid

若要比較基準測試結果與另一個版本/commit/分支的變更,請使用 --compare 選項(或等效的 -c

spin bench --compare v1.6.2 -t bench_core
spin bench --compare 20d03bcfd -t bench_core
spin bench -c main -t bench_core

上述所有命令都會在主控台中以純文字顯示結果,且結果不會儲存以與未來的 commit 進行比較。為了獲得更大的控制、圖形化檢視,以及儲存結果以供未來比較,您可以執行 ASV 命令(記錄結果並產生 HTML)

cd benchmarks
asv run -n -e --python=same
asv publish
asv preview

關於如何使用 asv 的更多資訊,請參閱 ASV 文件。命令列說明通常可透過 asv --helpasv run --help 取得。

基準測試版本#

若要僅在本機基準測試或視覺化不同機器上的發行版本,可以在使用 asv 執行之前,產生具有其 commit 的標籤,即

cd benchmarks
# Get commits for tags
# delete tag_commits.txt before re-runs
for gtag in $(git tag --list --sort taggerdate | grep "^v"); do
git log $gtag --oneline -n1 --decorate=no | awk '{print $1;}' >> tag_commits.txt
done
# Use the last 20
tail --lines=20 tag_commits.txt > 20_vers.txt
asv run HASHFILE:20_vers.txt
# Publish and view
asv publish
asv preview

有關貢獻這些內容的詳細資訊,請參閱基準測試結果儲存庫

編寫基準測試#

有關如何編寫基準測試的基本知識,請參閱 ASV 文件

一些需要考量的事項

  • 基準測試套件應可與任何 NumPy 版本匯入。

  • 基準測試參數等不應取決於安裝哪個 NumPy 版本。

  • 盡量使基準測試的執行時間合理。

  • 基準測試時間時,請優先使用 ASV 的 time_ 方法,而不是透過 time.clock 拼湊時間測量,即使在編寫基準測試時需要一些調整。

  • 準備陣列等通常應放在 setup 方法中,而不是 time_ 方法中,以避免將準備時間與基準測試操作的時間一起計算。

  • 請注意,使用 np.emptynp.zeros 建立的大型陣列可能不會在存取記憶體之前配置在實體記憶體中。如果這是所需的行為,請務必在您的設定函數中註解它。如果您正在基準測試演算法,則使用者不太可能在新建立的空/零陣列上執行上述演算法。可以透過在建立陣列後呼叫 np.onesarr.fill(value) 來強制在設定階段發生分頁錯誤。