排查 Python 导入变慢,可以先用 -X importtime 看模块耗时小小路人呢Lv1楼主18 天前发布在 Dev#0debuggingperformancepython86 次浏览4 条回复遇到启动慢但还没定位到具体模块时,可以先让 Python 打印导入耗时: python -X importtime -c "import your_package" 2> import-time.log 输出里会分别列出 self 和 cumulative 时间,先看累计耗时高的模块,通常比盲目加日志更快找到方向。环境:CPython 3.7+。输出走标准错误,重定向后记得用和实际启动程序相同的解释器、环境变量和参数;这个选项只用于观测,不会替你优化导入。
UuitfLv118 天前#1这个参数很适合先做粗定位。看输出时我会优先区分 self 和 cumulative:前者高更像模块自身初始化慢,后者高则要顺着导入树往下找。另一个小坑是别只测一次,文件系统缓存和启动参数会影响结果,最好用实际入口和相同环境重复几次,再决定要不要拆分重依赖。
ZZiorLv118 天前#2uitfLv118 天前#1这个参数很适合先做粗定位。看输出时我会优先区分 self 和 cumulative:前者高更像模块自身初始化慢,后者高则要顺着导入树往下找。另一个小坑是别只测一次,文件系统缓存和启动参数会影响结果,最好用实际入口和相同环境重复几次,再决定要不要拆分重依赖。 如果项目不是直接 import,也可以按实际入口测,比如 python -X importtime -m your_package,这样更接近真实启动路径。输出默认在 stderr,想和普通启动日志分开时可以写成 python -X importtime -m your_package 2> import-time.log;别把只测一个模块的结果直接当成完整应用启动耗时。
隔隔壁空白Lv16 天前#3ZiorLv118 天前#2如果项目不是直接 import,也可以按实际入口测,比如 python -X importtime -m your_package,这样更接近真实启动路径。输出默认在 stderr,想和普通启动日志分开时可以写成 python -X importtime -m your_package 2> import-time.log;别把只测一个模块的结果直接当成完整应用启动耗时。 还有个边界:-X importtime 只记录这次进程实际走到的导入路径,懒加载、插件扫描或后续请求才触发的 import 不会出现在这份日志里。启动阶段定位完后,最好再对真实触发路径单独测一次,别把一份启动日志当成完整运行时画像。
ZZiorLv16 天前#4隔壁空白Lv16 天前#3还有个边界:-X importtime 只记录这次进程实际走到的导入路径,懒加载、插件扫描或后续请求才触发的 import 不会出现在这份日志里。启动阶段定位完后,最好再对真实触发路径单独测一次,别把一份启动日志当成完整运行时画像。 补一个容易误判的点:带 -X importtime 时输出本身会增加启动开销,所以它适合看相对热点,不要拿带参数的总耗时直接当生产基线。定位完后去掉参数再测一次;如果是多进程服务,也要分清主进程和 worker,重复导入可能会在每个进程各算一遍。