如何在 Python 中对单元测试进行时间分析?

How can I time-profile unittests in Python?

我有一个测试套件和正在测试的代码。如果我将 from memory_profiler import profile 放在适当文件的顶部,用 @profile 修饰我想要分析的函数,并用 python TestThing.py 以标准方式修饰 运行,我会得到很好的结果-逐行结果。

但是 line_profiler 并没有以这种方式打包,我能够用它分析任何东西的唯一方法是 kernprof -l -v thing.py。如果我在我的单元测试中使用它,none 的测试是 运行(真的不足为奇),并且不会生成任何结果。我如何以类似于 memory_profiler 的方式对我的测试和它们使用的代码进行时间分析?

当然可以 import line_profiler:

import line_profiler

profiler = line_profiler.LineProfiler()


@profiler
def foo():
    for i in range(10):
        print(i)


foo()

profiler.dump_stats('foo.lprof')

结果存储在 foo.lprof.

或者,你可以包装一个 memory_profiler 这样的装饰器,调用后打印结果:

def profile_and_show(func):
    profiler = line_profiler.LineProfiler(func)
    def _(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        finally:
            lstats = profiler.get_stats()
            line_profiler.show_text(lstats.timings, lstats.unit)
    return _

请检查pytest-line-profiler

您只需要用要剖析的函数修饰(标记)一个或多个测试,最后会得到逐行报告。

PS:我是这个插件的作者,非常感谢您的反馈。