Python 分析:使用 line_profiler 的 @profile 装饰器会导致错误

Posted

技术标签:

【中文标题】Python 分析:使用 line_profiler 的 @profile 装饰器会导致错误【英文标题】:Python profiling: using line_profiler's @profile decorator results in error 【发布时间】:2014-11-21 07:55:01 【问题描述】:

我正在尝试使用 line_profiler 模块分析一些 Python 代码,但我无法让它工作。我在 Windows 7 上并使用 Python 2.7.6。

在以下test.py 文件上运行kernprof -l -v test.py 时:

@profile
def test():
    a = 1
    b = 1
    return a + b

if __name__ == '__main__':
    print test()

我明白了:

C:\>kernprof -l -v C:\test.py
Wrote profile results to test.py.lprof
Timer unit: 3.01262e-07 s

Traceback (most recent call last):
  File "C:\path_to_kernprof\kernprof-script.py", line 10, in <module>
    sys.exit(main())
  File "C:\path_to_kernprof\kernprof.py", line 221, in main
    execfile(script_file, ns, ns)
  File "C:\test.py", line 1, in <module>
    @profile
NameError: name 'profile' is not defined

显然,如果我注释掉包含line_profiler 的@profile 装饰器的行,代码将运行良好。我做错了什么,在这里?

【问题讨论】:

我无法重现您的错误。 我认为这是某种安装问题。 附带说明一下,我已经切换到 pprofile 模块以满足我的分析需求,它工作得很好。 我遇到了同样的错误,pprofile 也适用于我。非常感谢! 【参考方案1】:

可能与 python 2 和 futures 有关,请参阅this 错误报告,this 拉取请求修复了此问题。在新版本上传到pypi之前,可以根据commit修改代码。

【讨论】:

【参考方案2】:
from memory_profiler import profile

@profile

def my_func():
    a = [1] * (10 ** 6)
    b = [2] * (2 * 10 ** 7)
    del b
    return a

或:

python -m memory_profiler example.py

https://pypi.org/project/memory-profiler/

【讨论】:

【参考方案3】:

这是 networkx 包 1.11 中的一个错误的结果。像这样降级:

pip uninstall networkx
pip install networkx==1.7

【讨论】:

我遇到了同样的问题。不幸的是,Networkx 降级并没有解决它。

以上是关于Python 分析:使用 line_profiler 的 @profile 装饰器会导致错误的主要内容,如果未能解决你的问题,请参考以下文章

Python,django:用line_profiler工具分析代码的性能

Python line_profiler 找不到模块

安装python性能检测工具line_profiler

Python Line_profiler 和 Cython 函数

逐行分析 Django 视图

python line_profiler,speedup,timeit