Python 3.11 模块导入在冷启动时提速10%–25%,主要得益于字节码预编译、_frozen_importlib重写及.pyc头部校验优化,但热导入和内置模块差异极小。

Python 3.11 的模块导入确实变快了,但提升幅度取决于场景
核心结论:CPython 3.11 在模块加载(尤其是冷启动首次 import)上比 3.10 有可观改进,主要来自字节码预编译和更快的 _frozen_importlib 初始化,但纯热导入(已缓存 .pyc)差异极小。实测典型项目冷启动导入耗时平均降低 10%–25%,不是数量级变化。
关键优化点是字节码生成阶段的跳过与复用
3.11 默认启用 py_compile.PYC_INVALIDATION_MODE 的新策略,并在 importlib._bootstrap_external 中大幅减少重复校验。它不再为每个源文件都调用 os.stat() 检查 mtime,而是依赖更紧凑的 .pyc 头部校验和 + 缓存时间戳映射表。
- 若你禁用了
.pyc编译(如设PYTHONDONTWRITEBYTECODE=1),3.11 的优势几乎消失 -
__pycache__目录结构不变,但.pyc文件头部多出 8 字节校验字段,旧版本无法读取 - 使用
zipimport或冻结模块(frozen modules)时,3.11 启动更快,因为_frozen_importlib本身被重写为更少函数调用的 C 实现
真实影响最大的是大型包的顶层 __init__.py 执行
像 numpy、pandas 这类包,其 __init__.py 会触发大量子模块导入和运行时逻辑。3.11 对 importlib._bootstrap 中的 exec_module 路径做了内联优化,减少了帧对象创建和异常处理开销。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 测试方法:用
python -X importtime -c "import pandas"查看各模块耗时,3.11 中pandas.__init__和pandas._libs加载阶段明显缩短 - 但如果你的代码大量使用
importlib.import_module("xxx")动态导入,且模块名拼接复杂,3.11 改进有限——瓶颈在字符串操作和查找,不在底层加载器 - 注意:3.11 默认开启
PEP 654的异常组支持,这会让所有try/except块略微变重;若你代码中__init__.py里有密集异常处理,可能抵消部分导入收益
验证与调优建议:别只看 import time,要盯住冷路径
单纯跑 time python -c "import json" 看不出差别,因为 json 是内置模块,走的是冻结路径,3.10 和 3.11 差异微乎其微。真正该测的是带多层相对导入、条件导入、或含 C 扩展初始化的第三方包。
立即学习“Python免费学习笔记(深入)”;
- 推荐命令:
python -X importtime -c "import torch" 2> import.log && python -m pyperf command --setup="import sys; sys.path.insert(0, '.')" "import torch" - 检查
sys.path中是否存在大量网络挂载或 NFS 路径——3.11 的 stat 优化对此无效,IO 仍是瓶颈 - 若你在容器中部署,确保基础镜像已预热
__pycache__(如构建时执行一次import),否则每次冷启动仍要走完整编译流程
.pyc 失效判断更准,但也意味着某些 hack 式的 importlib.invalidate_caches() 行为可能失效。


















