line_profiler需用pip安装并配合kernprof运行,@profile装饰器仅对kernprof执行路径覆盖的函数生效,输出中%time为单行自身耗时占比,不追踪未修饰子函数或c扩展。

line_profiler 安装和基本装饰用法
line_profiler 不是 Python 内置模块,必须单独安装,且不能直接用 @profile 装饰后运行就出结果——它需要配合命令行工具 kernprof 启动。跳过这步会发现函数毫无输出,甚至报错 NameError: name 'profile' is not defined。
- 用 pip 安装:
pip install line_profiler - 在目标函数上方加装饰器:
@profile(注意:不带括号,也不导入任何东西) - 运行时不能用
python script.py,而要用:kernprof -l -v script.py;其中-l表示收集行级数据,-v表示立即打印结果
为什么 @profile 修饰的函数没被分析?
常见原因是函数没被实际调用,或者 @profile 放错了位置——它只对被 kernprof 执行路径覆盖到的函数生效。比如函数定义在模块里但没被 import 或调用,或被条件分支绕过,那对应行就不会出现在报告中。
-
@profile只作用于它紧邻下方的函数,不能跨函数、不能修饰类方法(除非手动 patch) - 如果函数在 if/else 或 try/except 中,确保该分支确实执行了
- 若用 pytest 运行,需额外加插件:
pip install pytest-kernprof,否则@profile无效
看懂 line_profiler 输出的关键列含义
输出表格里最易误解的是 %Time 和 Line Contents 两列。%Time 是该行自身耗时占整个函数总耗时的百分比,不是累积值;Line Contents 显示的是源码,但缩进会被抹平,所以别靠空格判断嵌套层级。
-
Line:源文件中的行号,对应你写的代码行(不是反编译后的) -
Hits:该行被执行次数,对循环内语句特别有用,能快速识别高频执行点 -
Time:该行总耗时(单位:微秒),数值大但%Time小,说明单次快但调用频繁 - 注意:函数定义行(如
def slow_func():)也会计时,通常为 0,可忽略
分析嵌套调用或第三方函数时的限制
line_profiler 默认只跟踪当前模块中打了 @profile 的函数,不会自动深入未修饰的子函数,更不会进入 C 扩展(如 numpy 内部)。想看 np.dot 或 json.loads 里面发生了什么?做不到。
- 若子函数也想分析,必须显式加上
@profile并确保它被kernprof加载 - 无法分析
__init__.py中的顶层代码,只能分析函数体 - 多线程下结果不可靠——
line_profiler不是线程安全的,会漏统计或报错
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











