A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer.
项目描述
A pytest fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer.
See calibration and FAQ.
自由软件:BSD 2-Clause License
安装
pip install pytest-benchmark
文档
对于最新版本:pytest-benchmark.readthedocs.org/en/stable.
对于master分支(可能包含文档修复):pytest-benchmark.readthedocs.io/en/latest.
示例
但首先,是一个序言
This plugin tightly integrates into pytest. To use this effectively you should know a thing or two about pytest first. Take a look at the introductory material or watch talks.
一些注意事项
此插件仅对函数进行基准测试。如果您想测量代码块或整个程序,您需要编写一个包装函数。
在测试中,您只能基准测试一个函数。如果您想基准测试多个函数,请编写更多的测试或使用参数化。
要运行基准测试,只需使用pytest运行您的“测试”。插件将自动进行基准测试并生成结果表格。运行pytest --help获取更多详细信息。
此插件提供了一个benchmark fixture。此 fixture 是一个可调用的对象,它将对传递给它的任何函数进行基准测试。
示例
def something(duration=0.000001):
"""
Function that needs some serious benchmarking.
"""
time.sleep(duration)
# You may return anything you want, like the result of a computation
return 123
def test_my_stuff(benchmark):
# benchmark something
result = benchmark(something)
# Extra code, to verify that the run completed correctly.
# Sometimes you may want to check the result, fast functions
# are no good if they return incorrect results :-)
assert result == 123
您还可以传递额外的参数
def test_my_stuff(benchmark):
benchmark(time.sleep, 0.02)
甚至关键字参数
def test_my_stuff(benchmark):
benchmark(time.sleep, duration=0.02)
在野外看到的一种模式,不推荐用于微基准测试(非常快的代码),但可能很方便
def test_my_stuff(benchmark):
@benchmark
def something(): # unnecessary function call
time.sleep(0.000001)
更好的方法是只基准测试最终函数
def test_my_stuff(benchmark):
benchmark(time.sleep, 0.000001) # way more accurate results!
如果您需要精细控制基准测试的运行方式(例如 setup 函数,精确控制 iterations 和 rounds),则有一个特殊模式 - pedantic
def my_special_setup():
...
def test_with_setup(benchmark):
benchmark.pedantic(something, setup=my_special_setup, args=(1, 2, 3), kwargs={'foo': 'bar'}, iterations=10, rounds=100)
屏幕截图
正常运行
比较模式(--benchmark-compare)
直方图(--benchmark-histogram)
此外,它还有友好的工具提示。
开发
要运行所有测试,请运行
tox
致谢
变更日志
4.0.0 (2022-10-26)
不再支持旧版 Python(2.7、3.6 或更早版本)。
将 CI 转换为 GitHub Actions。
删除了对 py 库的依赖(实际上也没有正确指定为依赖项)。
修复在 test_utils.py 中跳过测试的情况,如果合适的 VCS 不可用。还修复了拼写错误。由 Sam James 在 #211 贡献。
通过使用 pytest.hookimpl 和 pytest.hookspec 配置钩子,增加了对 pytest 7.2.0 的支持。由 Florian Bruhin 在 #224 贡献。
如果使用 --benchmark-disable,则不会尝试保存。修复了 #205。由 Friedrich Delgado 在 #207 贡献。
3.4.1 (2021-04-17)
重新发布,并更新了变更日志。
我打算发布一个 3.3.0 版本,但由于 bumpversion 与 pre-commit 似乎不起作用,所以我意外地设置了 3.4.0。
3.4.0 (2021-04-17)
除非使用 --benchmark-verbose,否则禁用进度指示。由 Dimitris Rozakis 在 #149 贡献。
添加了对 Python 3.9 的支持,删除了对 Python 3.5 的支持。由 Miroslav Šedivý 在 #189 贡献。
将 json 输出的“cpu”数据更改为包含 cpuinfo 输出的所有内容,好坏参半,因为 cpuinfo 6.0 改变了一些字段。现在,用户应确保安装了合适的 cpuinfo 包。可能不向后兼容
更改了 --benchmark-skip 和 --benchmark-only 的行为,使其在收集阶段早期应用。这意味着跳过的测试不会使 pytest 无需要地运行 fixtures,但不幸的是,这也意味着跳过行为将应用于任何需要“benchmark” fixture 的测试,无论它来自 pytest-benchmark 还是其他地方。可能不向后兼容
添加了 --benchmark-quiet 选项,以禁用报告和其他信息输出。
当使用 --benchmark-disable 和 save 选项时,关闭了不必要的警告。修复了 #199 问题。
PerformanceRegression 异常不再继承 pytest.UsageError(显然是一个 final 类)。
3.2.3 (2020-01-10)
修复了“已导入”的 pytest 警告。由 Jonathan Simon Prates 在 #151 中贡献。
修复了在使用 cprofile 功能时禁用基准测试时发生的损坏(通过禁用 cprofile)。
从测试套件中删除了 Python 3.4 并更新了测试依赖项。
修复了 pytest_benchmark.utils.clonefunc 以在 Python 3.8 上工作。
3.2.2 (2017-01-12)
添加了对没有 funcargs 的 pytest 项目的支持。修复了与其他 pytest 插件(如 pytest-flake8)的互操作性。
3.2.1 (2017-01-10)
更新了 3.2.0 的变更日志条目。我在同一天发布了 pytest-cov,并认为我已更新了两个插件的变更日志。不幸的是,我只更新了 pytest-cov。
添加了缺少的版本约束更改。现在需要 pytest >= 3.8(由于对 pytest 4.1 的支持)。
修复了几个 CI/test 问题。
修复了损坏的 pytest_benchmark.__version__。
3.2.0 (2017-01-07)
添加了对简单的 trial x 轴直方图标签的支持。由 Ken Crowell 在 #95 中贡献。
添加了对 Pytest 3.3+ 的支持。由 Julien Nicoulaud 在 #103 中贡献。
添加了对 Pytest 4.1 的支持。
进行了各种格式、拼写和文档修复。由 Ken Crowell、Ofek Lev、Matthew Feickert、Jose Eduardo、Anton Lodder、Alexander Duryagin 和 Grygorii Iermolenko 在 #97、#105、#110、#111、#115、#123、#131 和 #140 中贡献。
修复了损坏的 pytest_benchmark_update_machine_info 钩子。由 Alex Ford 在 #109 中贡献。
修复了在使用 --benchmark-disable 时出现的虚假 xdist 警告。由 Francesco Ballarin 在 #113 中贡献。
添加了对 pathlib2 的支持。由 Lincoln de Sousa 在 #114 中贡献。
更改了处理方式,您可以使用 --benchmark-skip 和 --benchmark-only,后者具有优先级。由 Ofek Lev 在 #116 中贡献。
3.1.1 (2017-07-26)
3.1.0 (2017-07-21)
添加了“每秒操作次数”(在 Stats 中的 ops 字段)指标,显示正在测试的代码的调用速率。由 Alexey Popravka 在 #78 中贡献。
在 commit_info 中添加了一个 time 字段。由“varac”在 #71 中贡献。
在< span class="docutils literal">commit_info 中添加了一个 author_time 字段。由“varac”贡献,参见#75。
通过遮盖存储数据到 Elasticsearch 时打印的 URL 来解决凭据泄露问题。
添加了 --benchmark-netrc 选项,在将数据存储到 Elasticsearch 时使用 netrc 文件中的凭据。由 Andre Bianchi 贡献,参见#73。
修复了有关挂钩的文档。由 Andre Bianchi 贡献,参见#74。
在猜测项目名称时移除了系统依赖项 git 和 hg。
3.1.0a2 (2017-03-27)
machine_info 现在包含有关 CPU 的更详细信息,特别是确切型号。由 Antonio Cuni 贡献,参见#61。
添加了 benchmark.extra_info,您可以使用它将任意信息保存到 JSON 中。由 Antonio Cuni 在同一 PR 中贡献。
修复了对最新 PyGal 版本(直方图)的支持。由 Swen Kooij 贡献,参见#68。
添加了对非仓库根目录运行时获取 commit_info 的支持。由 Vara Canero 贡献,参见#69。
在 CLI 中添加了 --storage/--verbose 选项的简写形式。
添加了一个替代的 pytest-benchmark CLI 二进制文件(除了 py.test-benchmark 之外),以匹配 pytest 中的疯狂。
修复了 CLI 中 --help 的某些问题。
改进了 git 远程解析(用于 JSON 输出的 commit_info)。
修复了 --benchmark-columns 的默认值。
修复了比较模式(加载时间太晚)。
从自动保存的名称中移除了项目名称。这将恢复 3.0 时的旧简短命名。
3.1.0a1 (2016-10-29)
添加了 --benchmark-columns 命令行选项。它选择在结果表中显示哪些列。由 Antonio Cuni 贡献,参见#34。
添加了对按特定测试参数化进行分组的支持(--benchmark-group-by=param:NAME,其中 NAME 是您的参数名称)。由 Antonio Cuni 贡献,参见#37。
添加了对 name 或 fullname 在 --benchmark-sort 中的支持。由 Antonio Cuni 贡献,参见#37。
更改了 pytest_benchmark_generate_json 钩子的签名,以接受 2 个新参数:machine_info 和 commit_info。
将 --benchmark-histogram 更改为绘制组而不是名称匹配的运行。
将 --benchmark-histogram 更改为绘制您比较的确切内容。现在它与比较功能完全匹配。
将 --benchmark-compare 更改为允许使用 glob。现在您可以与所有之前的运行进行比较。
将 --benchmark-group-by 更改为允许使用逗号分隔的多个值。例如:--benchmark-group-by=param:foo,param:bar
添加了一个用于比较先前数据的命令行工具:py.test-benchmark。它有两个命令
list - 列出所有可用文件。
compare - 显示结果表格。接受选项
--sort=COL
--group-by=LABEL
--columns=LABELS
--histogram=[FILENAME-PREFIX]
添加了 --benchmark-cprofile,可以分析最后运行的基准函数。由 Petr Šebek 贡献。
修改了 --benchmark-storage,现在它允许使用 elasticsearch 存储。允许将数据存储到 elasticsearch 而不是 json 文件中。由 Petr Šebek 在 #58 中贡献。
3.0.0 (2015-11-08)
改进了 --help 文本,包括 --benchmark-histogram、--benchmark-save 和 --benchmark-autosave。
在测试期间抛出异常的基准测试现在在结果表格中有特殊突出显示(红色背景)。
抛出异常的基准测试不再包含在保存的数据中(您仍然可以通过在 conftest.py 中实现 pytest_benchmark_generate_json 来恢复旧的行为)。
插件将使用 pytest 的警告系统进行警告。有 2 个类别:WBENCHMARK-C(比较模式问题)和 WBENCHMARK-U(使用问题)。
只有在使用 --benchmark-verbose 时才会显示红色警告。它们仍然会在 pytest-warnings 部分中始终显示。
不允许多次使用基准测试固定装置(将引发异常)。
未使用基准测试固定装置(但要求使用)将发出警告(WBENCHMARK-U1)。
3.0.0rc1(2015-10-25)
将 --benchmark-warmup 修改为可选值,并在 PyPy 上自动激活(默认值是 auto)。**可能向后不兼容**
移除了比较模式中的版本检查(以前如果当前版本低于文件中的版本则会发出警告)。
3.0.0b3(2015-10-22)
修改了结果表中比较的显示方式。现在以前运行的测试作为正常运行显示,并且名称会有特殊的后缀以指示来源。例如:“test_foobar (NOW)” 或 “test_foobar (0123)”。
修复了结果表中的排序。现在行按排序列排序,然后按名称排序。
在标题部分显示插件版本。
将默认选项的显示移动到标题部分。
3.0.0b2(2015-10-17)
添加了 --benchmark-disable 选项。当 xdist 开启时,它会自动激活
当 xdist 开启或无法导入 statistics 时,将自动激活 --benchmark-disable(而不是 --benchmark-skip)。**向后不兼容**
用新的 hookwrapper 系统替换了过时的 __multicall__。
改进了 --benchmark-max-time 的描述。
3.0.0b1(2015-10-13)
结果表中的测试按字母顺序排序。
无法导入 statistics 时不再创建硬错误。如果发生导入失败,基准测试将自动跳过。这在 Python 3.2(或更早的 Python)中会发生。
3.0.0a4(2015-10-08)
更改了处理获取提交信息失败的方式:现在它们是软失败。以前这会导致整个测试套件失败,仅仅是因为您没有安装 git/hg。
3.0.0a3(2015-10-02)
在计算统计信息时添加了进度指示。
3.0.0a2(2015-09-30)
修复了由于 capturemanager 使用不当而导致的意外输出捕获。
3.0.0a1(2015-09-13)
添加了JSON报告保存功能(命令行参数 --benchmark-json)。基于Dave Collins在#8中的初步工作。
添加了基准数据存储功能(命令行参数 --benchmark-save 和 --benchmark-autosave)。
添加了与之前运行的比较功能(命令行参数 --benchmark-compare)。
添加了性能回归检查功能(命令行参数 --benchmark-compare-fail)。
添加了按测试名称的各个部分进行分组的可能性(命令行参数 --benchmark-compare-group-by)。
添加了历史绘图功能(命令行参数 --benchmark-histogram)。
添加了微调校准的选项(命令行参数 --benchmark-calibration-precision 和 calibration_precision 标记选项)。
将 benchmark_weave 改为不再是一个上下文管理器。清理操作将自动执行。向后不兼容
添加了 benchmark.weave 方法(benchmark_weave 修复件的替代品)。
添加了新的钩子以允许自定义
pytest_benchmark_generate_machine_info(config)
pytest_benchmark_update_machine_info(config, info)
pytest_benchmark_generate_commit_info(config)
pytest_benchmark_update_commit_info(config, info)
pytest_benchmark_group_stats(config, benchmarks, group_by)
pytest_benchmark_generate_json(config, benchmarks, include_data)
pytest_benchmark_update_json(config, benchmarks, output_json)
pytest_benchmark_compare_machine_info(config, benchmarksession, machine_info, compared_benchmark)
更改了计时代码
当运行测试函数时(如覆盖率跟踪器)自动禁用跟踪器。
修复了校准代码卡住的问题。
通过 benchmark.pedantic() 添加了 pedantic mode。此模式禁用校准并允许设置函数。
2.5.0 (2015-06-20)
略微改进了测试套件(不再使用 cram)。
改进了关于 --benchmark-warmup 选项的帮助文本。
将 warmup_iterations 作为标记参数提供(例如:@pytest.mark.benchmark(warmup_iterations=1234))。
修复了 --benchmark-verbose 的打印输出,使其能够与输出捕获正常工作。
更改了计算预热迭代的方式(现在使用总迭代次数,而不是仅使用轮次)。
修复了一个校准会无限期运行的错误。
当结果表中只有一个测试时,禁用了红/绿着色(有点随机)。
2.4.1 (2015-03-16)
修复了回归问题,插件在未安装 xdist 时会引发 ValueError: no option named 'dist'。
2.4.0 (2015-03-12)
添加了一个实验性的 benchmark_weave 修复件。
修复了当 xdist 插件激活时的内部失败。
如果 xdist 激活,则自动禁用基准测试。
2.3.0 (2014-12-27)
将预热移至校准阶段。解决了在 PyPy 上基准测试的问题。
添加了 --benchmark-warmup-iterations 选项以微调它。
2.2.0 (2014-12-26)
将默认轮数减小(以便更准确地反映方差)。
在 --help 部分显示默认值。
2.1.0 (2014-12-20)
简化了校准代码,以便轮数更小。
添加了校准代码的诊断输出(--benchmark-verbose)。
2.0.0 (2014-12-19)
用简单的回调接口替换基于上下文管理器的 API。 向后不兼容
实现计时器校准以进行精确测量。
1.0.0 (2014-12-15)
为 PyPy 使用精确的默认计时器。
? (?)
README 和样式修复。由 Marc Abramowitz 贡献,在 #4。
许多重大更改。
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码发行版
构建分发版
pytest-benchmark-4.0.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fb0785b83efe599a6a956361c0691ae1dbb5318018561af10f3e915caa0048d1 |
|
MD5 | 66f318729685c9e637e0c4e7536a7b0a |
|
BLAKE2b-256 | 2808e6b0067efa9a1f2a1eb3043ecd8a0c48bfeb60d3255006dcc829d72d5da2 |
pytest_benchmark-4.0.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | fdb7db64e31c8b277dff9850d2a2556d8b60bcb0ea6524e36e28ffd7c87f71d6 |
|
MD5 | 686e2b434dc17071f454ef28964d189f |
|
BLAKE2b-256 | 4da13b70862b5b3f830f0422844f25a823d0470739d994466be9dbbbb414d85a |