跳至主要内容

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 函数,精确控制 iterationsrounds),则有一个特殊模式 - 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)

屏幕截图

正常运行

Screenshot of pytest summary

比较模式(--benchmark-compare

Screenshot of pytest summary in compare mode

直方图(--benchmark-histogram

Histogram sample

此外,它还有友好的工具提示

开发

要运行所有测试,请运行

tox

致谢

变更日志

4.0.0 (2022-10-26)

  • 不再支持旧版 Python(2.7、3.6 或更早版本)。

  • 将 CI 转换为 GitHub Actions。

  • 删除了对 py 库的依赖(实际上也没有正确指定为依赖项)。

  • 修复在 test_utils.py 中跳过测试的情况,如果合适的 VCS 不可用。还修复了拼写错误。由 Sam James 在 #211 贡献。

  • 通过使用 pytest.hookimplpytest.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.0 的支持。由 Pablo Aguiar 在 #129#130 中贡献。

  • 添加了对 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 中贡献。

  • 修复了各种 CI/测试问题。由 Stanislav Levin 在 #134#136#138 中贡献。

3.1.1 (2017-07-26)

  • 修复了从旧 json 文件加载数据的问题(缺少 ops 字段,见 #81)。

  • 修复了损坏的 SCM 的回归(见 #82)。

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

  • 在猜测项目名称时移除了系统依赖项 githg

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

  • 添加了对 namefullname--benchmark-sort 中的支持。由 Antonio Cuni 贡献,参见#37

  • 更改了 pytest_benchmark_generate_json 钩子的签名,以接受 2 个新参数:machine_infocommit_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-precisioncalibration_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 (334.6 kB 查看哈希值)

上传时间 源代码

构建分发版

pytest_benchmark-4.0.0-py3-none-any.whl (44.0 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面