核心要点

  • 能描述源码 → 字节码 → 解释执行的链路

  • 知道 .pyc、pycache、compile() 的作用

  • 了解 GIL 对多线程的影响

标准回答

执行链路

  1. 解析:源码 → AST(抽象语法树)
  2. 编译:AST → 字节码(bytecode),缓存为 __pycache__/*.pyc
  3. 执行: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)。

追问 2GIL 为什么存在?

简化 CPython 对象模型的线程安全(引用计数等),降低实现复杂度。多进程或调用释放 GIL 的 C 库(NumPy、IO)可绕过 CPU 并行限制。

追问 3Python 算解释型还是编译型?

二者兼有:先编译成字节码,再解释执行。常说「解释型」指不先整程序编译成机器码。PyPy 在字节码层加 JIT 编译为机器码。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。