类似于nosetests的Python基准测试工具?

8

我想要什么

我想为我的Python项目创建一组基准测试。我希望看到这些基准测试的性能随着我引入新代码而发生变化。我希望以与测试Python相同的方式执行此操作,即运行实用程序命令(例如nosetests)并获得一个漂亮格式的输出。

nosetests的优点

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

我想要类似的工具,可以搜索所有文件bench_foo.py并运行其中包含的所有函数bench_bar(),并报告它们的运行时间。

问题

是否存在这样的工具?

如果没有,有哪些好的起点?nose源代码是否适合此任务?


1
我不知道是否有现成的工具可以按照要求搜索所有包中的 bench_XXX,但我经常使用 nosetests --with-profile 来了解哪些代码性能好或差。 - JohnJ
2个回答

4

nosetests可以运行任何类型的测试,所以您可以决定它们是否测试功能、输入/输出有效性等,或者性能或分析(或您喜欢的任何其他内容)。Python分析器是一款很棒的工具,而且它随着您的Python安装而来。

import unittest
import cProfile

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

您只需在测试中添加一行代码,或将所有要进行性能分析的调用添加到测试用例中,这样您的主要源代码就不会被测试代码污染。
如果您只想计时执行时间而不是所有的性能分析信息,则timeit是另一个有用的工具。

3

wheezy文档中有一个很好的示例,说明如何使用nose完成此操作。如果您只想获得时间信息,则重要部分是使用选项-q进行安静运行,-s不捕获输出(这样您将看到报告的输出),并且-m benchmark仅运行“timing”测试。

我建议使用py.test进行测试。要在其中运行来自wheezy的示例,请将runTest方法的名称更改为test_bench_run,并仅使用以下命令运行此基准测试:

py.test -qs -k test_bench benchmark_hello.py

(-q-s具有与nose相同的效果,并且-k用于选择测试名称的模式)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接