如何在Python

时间:2015-10-28 19:51:15

标签: python profiling python-decorators

我有一组python脚本,我想用kernprof https://github.com/rkern/line_profiler来分析,但我也希望能够在没有kernprof的正常执行期间运行它。

在没有kernprof的情况下执行期间忽略未定义的@profile的优雅方法是什么?或任何其他装饰。

示例代码:

    @profile
    def hello():
        print('Testing')

    hello()

以:

运行
    kernprof -l test.py

在@profile方法

上正确执行探查器

以:

运行
    python test.py 

返回错误:

    Traceback (most recent call last):
    File "test.py", line 1, in <module>
    @profile
    NameError: name 'profile' is not defined

希望避免在任何地方捕获此错误,因为我希望代码执行,就好像@profile是一个no-op,当它没有用kernprof调用时。

谢谢! -Laura

编辑:我最终使用cProfile和kcachegrind并完全避免装饰器。

Using cProfile results with KCacheGrind

python -m cProfile -o profile_data.pyprof run_cli.py

pyprof2calltree -i profile_data.pyprof && qcachegrind profile_data.pyprof.log

2 个答案:

答案 0 :(得分:6)

如果没有从kernprof执行,则定义一个no-op装饰器:

if 'profile' not in globals():
    def profile(func):
        return func

答案 1 :(得分:-1)

Daniel提出的方法的一个变体是使用以下单行,然后根据您的分析需要对其进行注释和反对:

# Optional no-op decorator, comment when you want to profile
def profile(func): return func