我想为我的Python项目创建一组基准。我希望看到这些基准测试的性能随着我引入新代码而改变。我想以与测试Python相同的方式执行此操作,方法是运行像nosetests
这样的实用程序命令并获得格式良好的读数。
nosetests
nosetests
工具的工作原理是在我的目录结构中搜索名为test_foo.py
的任何函数,并运行其中包含的所有函数test_bar()
。它运行所有这些函数并打印出它们是否引发了异常。
我想要搜索所有文件bench_foo.py
的类似内容并运行所有包含的函数bench_bar()
并报告其运行时。
这样的工具是否存在?
如果没有什么好的起点?某些nose
来源是否适用于此?
答案 0 :(得分:3)
nosetests
可以运行任何类型的测试,因此您可以决定它们是否测试功能,输入/输出有效性等,或性能或性能分析(或您想要的任何其他内容)。 The Python Profiler是一个很棒的工具,它随Python安装一起提供。
import unittest
import cProfile
class ProfileTest(unittest.TestCase):
test_run_profiler:
cProfile.run('foo(bar)')
cProfile.run('baz(bar)')
您只需在测试中添加一行,或者为测试用例添加测试用于您要分析的所有调用,并且主要来源不会受到测试代码的污染。
如果您只想要执行时间而不是所有分析信息,timeit是另一个有用的工具。
答案 1 :(得分:3)
wheezy文档就如何使用nose做了一个很好的示例。如果您只想获得时间安排,那么重要的部分是使用选项-q
进行安静运行,-s
以便不捕获输出(因此您将看到报告的输出)和{{1}只运行'计时'测试。
我建议使用py.test进行测试。要使用-m benchmark
运行示例,请将wheezy
方法的名称更改为runTest
,并仅使用以下内容运行此基准:
test_bench_run
(py.test -qs -k test_bench benchmark_hello.py
和-q
与鼻子具有相同的效果,-s
选择测试名称的模式。“
如果您将基准测试文件放在与正常测试不同的文件或目录中,那么它们当然更容易选择,不需要特殊名称。