Python 程序启动慢到让人抓狂?一文教你从 8 秒降到 0.3 秒的真实优化全记录
—— 适用于命令行工具、Serverless、自动化脚本、甚至大型 Web 服务冷启动
大家好,我是老郑,写 Python 已经 15 年,从 2009 年用 Django 1.0 搭第一个论坛,到今天每天带着团队维护上百个百万 QPS 的微服务,我最深的感受就是:
“Python 启动慢” 不是原罪,而是可以被彻底治愈的慢性病。
我曾经接手过一个内部运维工具,第一次执行要整整 8.7 秒,运维同学每天敲命令都得泡一杯茶等它醒来。后来我花了两天时间优化,把启动时间从 8.7 秒干到 290 毫秒,直接把工具从“人人骂”变成了“人人爱”。
这篇文章,我把那套完整、可落地的优化方法全部公开给你,无论是初学者写小脚本,还是老鸟在优化 Serverless 冷启动,都能立刻用上。
一、先搞清楚:Python 到底慢在哪儿?
我们用一个真实的例子来感受一下:
$ time python -c "import django; django.setup(); from myapp.models import User"
# 第一次运行:8.12 秒
# 第二次运行:还是 7.89 秒(完全没有缓存!)
8 秒里到底发生了什么?
| 时间占比 | 罪魁祸首 | 典型表现 |
|---|---|---|
| 38% | 第三方包的 import | django、pandas、requests、sqlalchemy |
| 25% | site-packages 路径扫描 | Python 要遍历几百个 .egg/.dist-info |
| 18% | 动态字节码编译(.pyc 生成) | 第一次运行会编译所有导入的模块 |
| 12% | 各种 init.py 执行 | 包初始化、注册信号、创建连接池 |
| 7% | Python 解释器自身启动 | 解析 PYTHONPATH、初始化内置模块 |
下面我们按“性价比从高到低”逐个击破。
二、降到 2 秒以内:三板斧就够了(90% 项目只需这三招)
板斧一:用 Python -S 禁止自动 import site(省 1~3 秒)
# 普通方式
python main.py # 8.1s
# 禁止加载 site.py(大多数脚本不需要)
python -S main.py # 立刻降到 5.8s
python -S -X importtime main.py # 还能看到每行 import 耗时
-X importtime 是诊断神器,强烈建议每个人都试一次:
python -X importtime -c "import pandas" 2> import.log
# 打开 import.log 你会震惊:pandas 居然偷偷 import 了 127 个模块!
板斧二:延迟导入(Lazy Import)—— 把 import 放到真正需要的时候
坏习惯(80% 的人都在这么写):
# main.py 顶部
import pandas as pd
import django
from sqlalchemy import create_engine

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



