line_profiler需pip安装并用kernprof命令运行,仅分析标记@profile的函数;输出含Hits、Time等列,重点关注% Time定位瓶颈;不支持IDE右键直接运行,Jupyter需魔法命令%lprun。

line_profiler 安装和基本命令行用法
line_profiler 不是 Python 内置模块,必须单独安装,且不能直接用 python -m cProfile 替代。它依赖于 Cython 编译扩展,所以安装失败常因缺少编译环境或 wheel 不匹配。
- 推荐用 pip 安装:
pip install line_profiler;若报错“Failed building wheel”,可先装pip install cython再重试 - 安装后会提供命令行工具
kernprof,不是line_profiler命令本身 - 最简运行方式:
kernprof -l -v script.py,其中-l表示启用 line-by-line profiling,-v表示执行完立即打印结果 - 如果脚本需要参数,写在
script.py后面,例如:kernprof -l -v train.py --epochs 10
@profile 装饰器必须显式标记函数
line_profiler 不会自动分析所有函数,只对打了 @profile 标签的函数生效——这个装饰器由 line_profiler 注入到全局命名空间,不是手动定义的,也不需要 import。
- 在要分析的函数上方直接写
@profile,注意前面**不能**加from line_profiler import profile,否则会报NameError: name 'profile' is not defined - 如果函数在类中,
@profile要放在def上方,而非class上方;类方法可以被分析,但__init__或私有方法需同样标注 - 不加
@profile的函数即使被调用,也不会出现在结果里,包括内置函数(如sorted()、json.loads())——它们只会显示为“function call”,无行级数据 - 示例片段:
@profile def process_data(items): result = [] for i in items: # 这一行会被计时 result.append(i * 2) # 这一行也会 return result
输出结果怎么看:重点关注 Hits、Time 和 Per Hit
line_profiler 输出按函数分块,每块含 5 列:Line #(行号)、Hits(执行次数)、Time(微秒级总耗时)、Per Hit(单次平均耗时)、% Time(占该函数总耗时百分比)、Line Contents(源码)。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
Hits为 0 表示该行根本没执行(比如条件分支未进入),不是“快”,而是“没跑” -
Time是绝对值,单位是微秒(μs),数值大不一定代表性能瓶颈——要看% Time是否集中;比如某行Time=50000(50ms),但占函数总耗时 95%,就值得优化 - 常见干扰项:
for循环头行(如for x in data:)的Hits是循环次数,Time包含迭代器开销和条件判断,不代表循环体耗时;真正耗时的通常是循环体内语句 - 如果某行显示
Time极小(如 0.0 或 1.0),可能是测量精度不足,或该行是纯语法结构(如pass、空注释)
与 IDE 或 Jupyter 集成的注意事项
在 PyCharm 或 VS Code 中直接右键运行带 @profile 的脚本,不会触发 line_profiler——因为没走 kernprof 入口。Jupyter 里也不能靠 %timeit 替代。
立即学习“Python免费学习笔记(深入)”;
- Jupyter 中可用魔法命令:
%load_ext line_profiler后,再用%lprun -f func_name func_name(args),但要求func_name已定义且已标注@profile - PyCharm 运行配置里,把 “Execution script” 改成
kernprof,参数设为-l -v /path/to/script.py,否则断点和 profiler 互斥 - 注意路径问题:如果脚本用相对路径导入模块(如
from utils import helper),kernprof执行时工作目录必须和预期一致,否则报ModuleNotFoundError;建议用python -c "import sys; print(sys.path)"对齐环境
实际用的时候,最容易漏掉的是 @profile 标记,或者误以为所有函数都会被分析。它不像 cProfile 那样“全自动”,而是“按需打点”,这点必须主动适应。

















