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