用空速对SciPy进行基准测试¶
This document introduces benchmarking, including reviewing SciPy benchmark test results online, writing a benchmark test, and running it locally. For a video run-through of writing a test and running it locally, see Benchmarking SciPy .
就像在 airspeed velocity (asv) documentation :
空速(Air Speed,ASV)是一种在Python包的生命周期内对其进行基准测试的工具。可以跟踪运行时、内存消耗,甚至可以跟踪自定义计算值。结果显示在一个互动的网络前端,只需要一个基本的静电网络服务器来托管。
要了解这意味着什么,请看一下 airspeed velocity of an unladen scipy 。每个图汇总了项目提交历史记录中特定测试的执行时间;也就是说,在合并每个提交时,运行基准测试,测量其执行时间,并绘制运行时间图。除了跟踪代码的性能之外,提交还包括 意向 影响,奔跑 all 每次提交的基准测试有助于识别无意的回归:一个或多个基准测试的执行时间显著增加。因为SciPy是一个互连的代码网络,所以对于贡献者来说,一个小变化的影响可能不会立即显现出来,所以这个基准测试套件使检测回归和识别导致它们的提交变得更容易。当您贡献了一个重要的新特性时--或者注意到一个特性还没有基准测试--请考虑编写基准测试。
编写基准测试¶
The Writing benchmarks 空速文档的一节是编写基准的权威指南。另请参阅 SciPy benchmarks readme .
要查看基准是如何编写的,请看一下 scipy/benchmarks/benchmarks/optimize_linprog.py
. 的每个子类 Benchmark
定义基准测试。例如, KleeMinty
类定义了一个基准测试,该基准测试基于 Klee-Minty hypercube problem ,这是对线性规划单纯形算法的一个可怕的检验。这门课有四个部分:
setup
准备基准以运行。此函数的执行时间为 not 计算在基准测试结果中,所以这里是设置定义问题的所有变量的好地方。在KleeMinty
例如,这涉及到生成数组c
,A_ub
,以及b_ub
对应于中的Klee-Minty超立方体dims
尺寸并将其存储为实例变量。time_klee_minty
实际运行基准测试。此函数在KleeMinty
对象已实例化,并且setup
已运行,因此它从以下位置获取定义问题的数组self
。请注意,前缀time
在函数名称中指示asv
此函数的执行时间 is 将计入基准结果。params
is a list of lists defining parameters of the test. Benchmarks are run for all possible combinations of these parameters. For example, the first time the benchmark is run, the first element ofmethods
(simplex
) is passed intosetup
andtime_klee_minty
as the first argument,meth
, and the first element of[3, 6, 9]
(3
) is passed intosetup
andtime_klee_minty
as the second argument,dims
. The next time the benchmark is run,setup
andtime_klee_minty
are passedrevised simplex
and6
as arguments, and so this continues until all combinations of parameters have been used.param_names
元素的每个元素的人类可读名称的列表。params
列表。这些是用来展示结果的。
过去几年此基准的结果可通过单击 KleeMinty.time_klee_minty 链接位置 airspeed velocity of an unladen scipy 。请注意,绘图的每个轨迹都对应于基准参数和环境设置的组合(例如,Cython版本),并且可以使用左侧的控制面板切换轨迹的可见性。
在本地运行基准测试¶
在开始之前,请确保 airspeed velocity 已安装。
在贡献了新的基准之后,您应该在本地测试它们,然后再提交拉取请求。
要运行所有基准测试,请导航到命令行中的SciPy根目录,然后执行::
python runtests.py --bench
哪里 --bench
激活基准测试套件而不是测试套件。这将构建SciPy并运行基准测试。( 注意:这可能需要一段时间。基准测试的运行时间通常比单元测试长,并且每个基准测试都会多次运行,以测量执行时间的分布情况。 )
要从特定的基准测试模块运行基准测试,例如 optimize_linprog.py
,只需附加不带扩展名的文件名::
python runtests.py --bench optimize_linprog
要运行类中定义的基准,例如 KleeMinty
从… optimize_linprog.py
::
python runtests.py --bench optimize_linprog.KleeMinty
要比较活动分支和另一个分支之间的基准结果,例如 master
::
python runtests.py --bench-compare master optimize_linprog.KleeMinty
上面的所有命令都在控制台中以纯文本形式显示结果,并且不会保存结果以便与将来的提交进行比较。要获得更好的控制、图形视图以及保存结果以供将来进行比较,可以使用 asv
直接执行终端命令。
要使用它,请导航到 scipy/benchmarks
在控制台中,然后执行::
asv run
该命令运行整个基准测试套件并保存结果,以便与将来的提交进行比较。
仅运行单个基准测试,例如 KleeMinty
从… optimize_linprog.py
::
asv run --bench optimize_linprog.KleeMinty
的一大特点是 asv
它不仅可以为当前提交自动运行基准,而且可以为某个范围内的每个提交自动运行基准。 linprog
method='interior-point'
已合并到带有提交的SciPy中 7fa17f2369e0e5ad055b23cc1a5ee079f9e8ca32
, 所以让我们运行 KleeMinty
从那时到现在对10个提交进行基准测试,以跟踪其随时间推移的性能::
asv run --bench optimize_linprog.KleeMinty --steps 10 7fa17f..
注解
这将需要一段时间,因为每次提交都必须重新构建SciPy!有关指定提交范围的更多信息,请参见 git revisions documentation 。
要“发布”结果(准备要查看的结果)并在交互式控制台中“预览”它们,请执行以下操作:
asv publish
asv preview
ASV将报告它正在运行服务器。使用任何浏览器,您都可以通过导航到http://127.0.0.1:8080(本地计算机,端口8080)来查看结果。
有关更多信息,请参阅 asv
命令,请参阅空速 Commands 文档。(提示:请查看 asv find
命令和 --quick
, --skip-existing-commits
,以及 --profile
选项: asv run
。)