使用airspeed velocity对SciPy进行基准测试#

本文档介绍基准测试,包括在线查看SciPy基准测试结果、编写基准测试以及在本地运行。有关编写测试并在本地运行的视频演示,请参见 SciPy基准测试

airspeed velocity (asv) 文档 中所述

空速速度(asv)是一个用于在其生命周期内基准测试Python包的工具。可以跟踪运行时间、内存消耗,甚至自定义计算的值。结果显示在一个交互式的网页前端,只需要一个基本的静态网页服务器来托管。

要了解这意味着什么,请查看 airspeed velocity of an unladen scipy。每个图表总结了项目提交历史中某个特定测试的执行时间;也就是说,每当提交合并时,基准测试就会运行,测量其执行时间,并将经过的时间绘制成图。除了跟踪代码的性能外,一个提交*旨在*影响的代码,运行*所有*基准测试对于识别无意中的回归非常有帮助:一个或多个基准测试执行时间的显著增加。由于 SciPy 是一个相互关联的代码网络,一个小变化的影响可能不会立即对贡献者显而易见,因此这个基准测试套件使得更容易检测回归并识别导致它们的提交。当你贡献一个重要的新功能——或者注意到一个还没有基准测试的功能——请考虑编写基准测试。

编写基准测试#

The 编写基准测试 部分是airspeed velocity文档中编写基准测试的权威指南。另请参阅 SciPy基准测试自述文件

要查看如何编写基准测试,请查看 scipy/benchmarks/benchmarks/optimize_linprog.py 。每个 Benchmark 的子类都定义了一个基准测试。例如, 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_minty 会接收到 revised simplex6 作为参数,如此继续,直到所有参数组合都被使用。

  • param_namesparams 列表中每个元素的人类可读名称列表。这些用于呈现结果。

过去几年中此基准测试的结果可以通过点击 airspeed velocity of an unladen scipy 上的 KleeMinty.time_klee_minty 链接获取。请注意,图表中的每个轨迹对应于一组基准参数和环境设置(例如,Cython 版本),并且可以使用左侧的控制面板切换轨迹的可见性。

本地运行基准测试#

开始之前,请确保 airspeed velocity 已安装。

在贡献新的基准测试之后,你应该在提交拉取请求之前在本地测试它们。

要运行所有基准测试,请在命令行中导航到 SciPy 根目录并执行:

python dev.py bench

其中 bench 激活的是基准测试套件,而不是测试套件。这将构建 SciPy 并运行基准测试。(注意:这可能需要一段时间。基准测试通常比单元测试运行时间更长,并且每个基准测试会多次运行以测量执行时间的分布。

要运行特定基准测试模块中的基准测试,例如 optimize_linprog.py,只需附加不带扩展名的文件名:

python dev.py bench -t optimize_linprog

要运行一个在类中定义的基准测试,例如来自 optimize_linprog.pyKleeMinty:

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.pyKleeMinty

asv run --bench optimize_linprog.KleeMinty

asv 的一个很棒的功能是,它不仅可以为当前提交自动运行基准测试,还可以为范围内的每个提交运行基准测试。linprog method='interior-point' 在提交 7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32 时被合并到 SciPy 中,所以让我们为从那时到现在的 10 个提交运行 KleeMinty 基准测试,以跟踪其性能随时间的变化:

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