Python -O 会移除 assert 语句和所有依赖 __debug__ 的代码分支,并将 __debug__ 设为 False;-OO 在此基础上额外移除所有文档字符串(__doc__)。

Python -O 会删掉哪些东西?
-O 不是“压缩字节码”,而是移除断言和 __debug__ 相关代码,并把 __debug__ 设为 False。它不会改变 .pyc 文件结构或做任何二进制层面的压缩,所以体积减少通常很小(几 KB 级别),主要来自丢弃 assert 语句和条件块中依赖 __debug__ 的分支。
常见误判:以为加了 -O 就能显著减小部署包体积——实际几乎没用,尤其对含大量第三方库的项目。
怎么验证 -O 是否生效?
最直接的方式是对比编译后字节码行为:
- 运行
python -O -m py_compile script.py,再用python -c "import dis; dis.dis(open('script.cpython-*.pyc','rb').read()[16:])"粗略看是否少了ASSERT指令(注意:需跳过 pyc header,偏移量一般为 16) - 更可靠的是写个测试脚本:
assert False在-O下不抛异常;if __debug__: print("debug")在-O下完全不执行 - 检查生成的 .pyc 文件时间戳和大小差异——但不要只看大小,很多情况下差异为 0,因为没可删内容
-OO 比 -O 多删了什么?
-OO 在 -O 基础上额外移除所有文档字符串(__doc__),这对体积影响略大些,尤其在自写模块里 docstring 很长时。但代价是:help() 失效、pydoc 查不到说明、某些框架(如 FastAPI)依赖 __doc__ 生成 API 文档会出问题。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
典型风险场景:
- 用
sphinx或pydoc生成文档的项目不能用-OO -
dataclasses或pydantic模型字段注释若靠 docstring 补充,-OO后可能丢失语义 - 某些调试工具(如
pdb)显示函数 docstring 的地方变空
真想减小字节码体积,该怎么做?
靠 -O 或 -OO 是走错方向。真正有效的办法是控制源码本身和构建流程:
- 删掉无用的注释和冗余 docstring(手动或用
pyminifier类工具,但注意别破坏可维护性) - 避免在代码中嵌入大段文本、base64 数据、JSON 字符串等——这些全会进字节码
- 用
zipapp打包时加--compress(Python 3.7+),它会对 .pyc 做 zlib 压缩,效果远超-O - 构建 Docker 镜像时用多阶段构建,只拷贝 .pyc 和必要资源,不带 .py 源文件——这才是体积下降的大头
最容易被忽略的一点:你看到的 “.pyc 体积” 往往只是磁盘上一个文件,而 Python 运行时加载的是解压后的内存镜像,优化字节码体积对运行时内存和启动速度基本没影响。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










