NumPy benchmarks#

使用 Airspeed Velocity 进行 NumPy 基准测试。

Usage#

Airspeed Velocity 会自行管理构建和 Python 虚拟环境,除非另有指示。要运行基准测试,您无需将 NumPy 的开发版本安装到当前的 Python 环境中。

开始之前,请确保已安装 airspeed velocity。默认情况下,asv 支持 anaconda 和 virtualenv。

pip install asv
pip install virtualenv

在贡献新基准测试后,您应该在提交拉取请求之前在本地进行测试。

要运行所有基准测试,请在命令行中导航到 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

要比较基准测试结果与另一个版本/提交/分支的变化,请使用 --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

以上所有命令都会在控制台中以纯文本形式显示结果,并且这些结果不会保存以与将来的提交进行比较。为了获得更大的控制力、图形视图以及将结果保存以供将来比较,您可以运行 ASV 命令(记录结果并生成 HTML)。

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

有关如何使用 asv 的更多信息,请参阅 ASV 文档。命令行帮助一如既往地可通过 asv --helpasv run --help 获取。

Benchmarking versions#

要在本地的 LFS(大文件存储)上基准测试或可视化不同的机器上的发行版,可以生成带有提交的标签,然后在 asv 运行之前,即

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

有关贡献这些内容的详细信息,请参阅 基准测试结果存储库

Writing benchmarks#

有关如何编写基准测试的基础知识,请参阅 ASV 文档

一些需要考虑的事项

  • 基准测试套件应可与任何 NumPy 版本一起导入。

  • 基准测试参数等不应依赖于安装的 NumPy 版本。

  • 尽量保持基准测试的运行时间合理。

  • 偏好使用 ASV 的 time_ 方法来衡量时间,而不是通过 time.clock 来制作时间测量,即使这需要在编写基准测试时进行一些调整。

  • 准备数组等通常应放在 setup 方法中,而不是 time_ 方法中,以避免将准备时间与被基准测试操作的时间一起计算。

  • 请注意,使用 np.emptynp.zeros 创建的大型数组可能直到内存被访问时才在物理内存中分配。如果这是期望的行为,请确保在 setup 函数中对其进行注释。如果您正在对某个算法进行基准测试,用户不太可能在刚创建的空/零数组上执行该算法。您可以通过在创建数组后调用 np.onesarr.fill(value) 来强制在 setup 阶段发生页面错误。