使用 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 中。下次运行基准测试时,setuptime_klee_mintyrevised simplex6 作为参数传递,依此类推,直到所有参数组合都被使用。

  • 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 中,因此让我们运行 KleeMinty 基准测试,从那时到现在运行 10 次提交,以跟踪其随时间的性能:

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 命令和 --quick--skip-existing-commits--profile 选项用于 asv run。)