使用空速速度对 SciPy 进行基准测试#
本文档介绍了基准测试,包括在线查看 SciPy 基准测试结果、编写基准测试以及在本地运行。有关编写测试并在本地运行的视频演示,请参见 SciPy 基准测试。
如 空速速度 (asv) 文档 中所述
空速速度 (asv) 是一个用于在整个生命周期内对 Python 包进行基准测试的工具。可以跟踪运行时、内存消耗,甚至自定义计算的值。结果将显示在交互式 Web 前端,只需要一个基本的静态 Web 服务器即可进行托管。
要了解这意味着什么,请查看 未装载的 SciPy 的空速速度。每个图总结了特定测试在项目提交历史记录中的执行时间;也就是说,每次合并提交时,都会运行基准测试,测量其执行时间,并将经过的时间绘制成图表。除了跟踪代码的性能外,预期 提交会影响,对每次提交运行所有基准测试有助于识别意外回归:一个或多个基准测试执行时间的显著增加。由于 SciPy 是一个相互关联的代码网络,因此小更改的影响可能不会立即被贡献者发现,因此此基准测试套件可以更轻松地检测回归并识别导致回归的提交。当您贡献一个实质性的新功能 - 或注意到一个还没有基准测试的功能 - 请考虑编写基准测试。
编写基准测试#
空速速度文档的 编写基准测试 部分是编写基准测试的权威指南。另请参见 SciPy 基准测试自述文件。
要查看基准测试是如何编写的,请查看 scipy/benchmarks/benchmarks/optimize_linprog.py
。每个 Benchmark
子类都定义了一个基准测试。例如,KleeMinty
类定义了一个基于 Klee-Minty 超立方体问题 的基准测试,这是一个对单纯形算法进行线性规划的严苛测试。该类有四个部分
setup
准备运行基准测试。此函数的执行时间不计入基准测试结果,因此这是一个设置定义问题的全部变量的好地方。在KleeMinty
示例中,这涉及生成对应于dims
维度中的 Klee-Minty 超立方体的数组c
、A_ub
和b_ub
,并将它们存储为实例变量。time_klee_minty
实际上运行基准测试。此函数在实例化KleeMinty
对象并运行setup
之后执行,因此它从self
获取定义问题的数组。请注意,函数名称中的前缀time
指示asv
此函数的执行时间将计入基准测试结果。params
是一个列表,其中包含定义测试参数的列表。基准测试将针对这些参数的所有可能组合运行。例如,第一次运行基准测试时,methods
的第一个元素 (simplex
) 将作为第一个参数meth
传递到setup
和time_klee_minty
中,[3, 6, 9]
的第一个元素 (3
) 将作为第二个参数dims
传递到setup
和time_klee_minty
中。下次运行基准测试时,setup
和time_klee_minty
将revised simplex
和6
作为参数传递,以此类推,直到所有参数组合都被使用。param_names
是一个列表,其中包含params
列表中每个元素的人类可读名称。这些用于呈现结果。
过去几年中此基准测试的结果可以通过点击 KleeMinty.time_klee_minty 链接获得,该链接位于 未装载的 SciPy 的空速速度 上。请注意,图中的每个轨迹对应于基准测试参数和环境设置 (例如,Cython 版本) 的组合,并且可以使用左侧控制面板切换轨迹的可见性。
在本地运行基准测试#
在开始之前,请确保已安装 空速速度。
贡献新的基准测试后,您应该在提交拉取请求之前在本地对其进行测试。
要运行所有基准测试,请在命令行中导航到根 SciPy 目录并执行
python dev.py bench
其中 bench
激活基准测试套件而不是测试套件。这会构建 SciPy 并运行基准测试。(注意:这可能需要一段时间。基准测试通常比单元测试运行时间更长,并且每个基准测试都会运行多次以测量执行时间的分布。)
要运行来自特定基准测试模块的基准测试,例如 optimize_linprog.py
,只需附加文件名,不带扩展名
python dev.py bench -t optimize_linprog
要运行在类中定义的基准测试,例如 KleeMinty
来自 optimize_linprog.py
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
此命令运行整个基准测试套件,并将结果保存以供与将来的提交进行比较。
要仅运行单个基准测试,例如 KleeMinty
来自 optimize_linprog.py
asv run --bench optimize_linprog.KleeMinty
asv
的一个很棒的功能是它不仅可以自动针对当前提交运行基准测试,还可以针对一个范围内的每个提交运行基准测试。 linprog
method='interior-point'
已使用提交 7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32
合并到 SciPy 中,因此让我们运行 KleeMinty
基准测试,从那时到现在的 10 次提交,以跟踪其性能随时间的变化
asv run --bench optimize_linprog.KleeMinty --steps 10 7fa17f..
注意
这将需要一段时间,因为 SciPy 需要针对每次提交重新构建!为了加快基准测试的构建过程,您可以安装 ccache 和 f90cache。如果它们安装在 /usr/lib
和 /usr/local/lib
中,基准测试套件会自动检测到它们。否则,您必须将它们添加到 PATH
环境变量中。
有关指定提交范围的更多信息,请参见 git 修订版文档。
要“发布”结果(准备查看它们)并在交互式控制台中“预览”它们
asv publish
asv preview
ASV 将报告它正在运行服务器。使用任何浏览器,您都可以通过导航到 http://127.0.0.1:8080 (本地计算机,端口 8080)来查看结果。
有关 asv
命令的更多信息,请参见空速速度 命令 文档。(提示:查看 asv find
命令以及 --quick
、--skip-existing-commits
和 --profile
选项,用于 asv run
。)