8

我想要的是

我想为我的 Python 项目创建一组基准测试。当我引入新代码时,我希望看到这些基准测试的性能发生变化。我想以与测试 Python 相同的方式执行此操作,方法是运行类似的实用程序命令nosetests并获得格式良好的读数。

我喜欢什么nosetests

nosetests工具通过在我的目录结构中搜索任何命名的函数test_foo.py并运行其中test_bar()包含的所有函数来工作。它运行所有这些函数并打印出它们是否引发了异常。

我想要类似的东西来搜索所有文件bench_foo.py并运行所有包含的函数bench_bar()并报告它们的运行时。

问题

这样的工具存在吗?

如果不是,有什么好的起点?一些nose来源适合这个吗?

4

2 回答 2

4

nosetests可以运行任何类型的测试,因此您可以决定它们是测试功能、输入/输出有效性等,还是性能或分析(或您想要的任何其他内容)。Python Profiler是一个很棒的工具,它随您的 Python 安装一起提供。

import unittest
import cProfile

class ProfileTest(unittest.TestCase):
    test_run_profiler:
        cProfile.run('foo(bar)')
        cProfile.run('baz(bar)')

您只需在测试中添加一行,或者为您想要分析的所有调用添加一个测试到测试用例,并且您的主要来源不会被测试代码污染。

如果您只想计时执行而不是所有的分析信息,timeit是另一个有用的工具。

于 2013-10-06T14:41:02.737 回答
3

wheezy文档有一个很好的例子来说明如何用鼻子做到这一点。如果您只想获得计时,重要的部分是使用-q安静运行的选项,-s不捕获输出(因此您将看到报告的输出)并且-m benchmark仅运行“计时”测试。

我建议使用py.test进行测试。要从中运行示例,请将方法wheezy的名称更改为并仅运行此基准测试:runTesttest_bench_run

py.test -qs -k test_bench benchmark_hello.py

-q并且-s具有与鼻子相同的效果并-k选择测试名称的模式)。

如果您将基准测试放在与普通测试不同的文件或目录中,它们当然更容易选择并且不需要特殊名称。

于 2013-10-07T07:01:35.260 回答