核心要点
能描述源码 → 字节码 → 解释执行的链路
知道 .pyc、pycache、compile() 的作用
了解 GIL 对多线程的影响
标准回答
执行链路:
- 解析:源码 → AST(抽象语法树)
- 编译:AST → 字节码(bytecode),缓存为
__pycache__/*.pyc - 执行:CPython 虚拟机逐条解释字节码(也可通过 C 扩展加速热点)
可用 dis.dis(fn) 反汇编查看字节码。
实现差异:CPython(参考实现)、PyPy(JIT 更快)、Jython/IronPython 跑在 JVM/.NET 上。
GIL(全局解释器锁):同一时刻仅一个线程执行 Python 字节码。I/O 密集多线程仍有效;CPU 密集应改用 multiprocessing 或 C 扩展/NumPy 释放 GIL。
AI 训练:计算在 PyTorch C++/CUDA 层,Python 层多为胶水代码,GIL 影响通常小于 GPU 计算本身。
常见误区
⚠️ 常见踩坑
把 Python 简单归为「纯解释型」——实际是先编译成字节码再解释执行。还有人以为 GIL 让多线程毫无意义:I/O 密集型多线程仍能受益,只有 CPU 密集才需 multiprocessing 或释放 GIL 的 C 扩展。也别把「编译成字节码」当成「编译成机器码」,后者是 PyPy 的 JIT 才做的。
追问
追问 1:.pyc 文件是什么?何时生成?
.pyc 是编译后的字节码缓存,存于 __pycache__,加速二次导入。源文件 mtime 变化会重新编译。python -O 可生成优化字节码(去掉 assert)。
追问 2:GIL 为什么存在?
简化 CPython 对象模型的线程安全(引用计数等),降低实现复杂度。多进程或调用释放 GIL 的 C 库(NumPy、IO)可绕过 CPU 并行限制。
追问 3:Python 算解释型还是编译型?
二者兼有:先编译成字节码,再解释执行。常说「解释型」指不先整程序编译成机器码。PyPy 在字节码层加 JIT 编译为机器码。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📰 AI 资讯
🛠️ AI 工具
- Pytorch
Meta 开源的深度学习框架,100K+ stars。以动态计算图和 Pythonic 风格著称,在学术界和工业界都有广泛应用,支持分布式训练、移动端部署和 ONNX 导出