← 返回列表
Lex Fridman Podcast播客26 Nov 2022来源: lexfridman.com主持: Lex Fridman

#341 – Guido van Rossum: Python and the Future of Programming

一句话导读

这篇访谈聊的是Python语言之父Guido van Rossum对Python现状和未来的看法。他认为Python 3.11性能大幅提升(10-60%)靠的不是JIT编译器,而是一种“自适应特化解释器”——它会在运行时偷偷观察变量类型,如果发现你总用整数加法,就生成一条专门处理整数加法的捷径指令,省去通用查找的麻烦。他看好微软的VS Code(他日常在用),也积极使用GitHub Copilot(每天用,省打字),但对PyCharm有保留,觉得它功能虽全但“像开18轮大卡车”一样笨重。

AI 摘要AI 生成 · 可能有误 · 以原文为准

本报告来自Lex Fridman Podcast第341期,主题为Python创始人Guido van Rossum对Python语言及编程未来的讨论。核心观点是Python作为一门简洁、易用的语言,其设计哲学(如BDFL模式)对社区发展至关重要。重要结论包括:Python在AI和数据科学领域的主导地位将持续,但需关注性能优化(如CPython改进)和类型提示的普及。Guido强调,编程语言的未来在于平衡简洁性与功能性,同时社区协作(如PEP流程)是语言演进的关键。具体数据方面,Python在TIOBE指数中排名第一,全球开发者超1500万,GitHub上Python项目占比约15%。

全文约 13 分钟 · 8 个章节
深度解读

本期速览

Guido van Rossum 是 Python 编程语言的创造者,现任微软资深开发者。本期核心围绕 Python 的设计哲学、性能演进与未来方向展开。全片最有分量的判断是:Python 3.11 实现 10-60% 性能提升并非通过 JIT 编译器,而是通过「自适应特化解释器」——在运行时动态识别变量类型模式并生成特化指令,本质是用统计预测替代通用路径,这是动态语言性能优化的关键突破。


一、Python 的设计哲学:可读性优先于一切

Guido van Rossum 认为,编程语言的核心矛盾在于「同一段代码需要同时面向计算机和人类读者」。Python 通过强制缩进(而非花括号)来定义代码块,这一设计在 30 年前是激进选择,至今仍是 Python 最鲜明的特征。

  • 历史脉络:Guido 在 80 年代学习编程时观察到,大多数语言(C、Java、JavaScript)使用花括号表示块结构,但新手常因遗漏分号或括号而编译失败。Python 用缩进消除这类语法噪声,让初学者「少担心一件事」。
  • 机制拆解:缩进不仅是风格建议,而是语言语法的一部分。Guido 承认「如果今天从头设计,仍会选择缩进——它释放了花括号对用于其他用途(如字典),且让代码结构一目了然」。但他也指出,Python 已成为「异类」,因为几乎所有主流语言都用花括号。
  • 数据支撑:PEP8 风格指南推荐 4 空格缩进,这是基于 80 年代屏幕宽度和可读性经验的折中。Google 内部 Python 代码使用 2 空格,Guido 认为「对不习惯的人来说,一眼理解代码结构更难」。

独到之处:Guido 将编程语言比作「同时写给计算机和人类的食谱」——计算机需要精确指令,人类需要可读结构。Python 的设计始终优先服务后者,这是其在新手中流行的关键原因。


二、CPython 3.11 的性能突破:自适应特化解释器

Guido van Rossum 指出,3.11 版本 10-60% 的性能提升来自「自适应特化解释器」,而非 JIT 编译器。核心思路是:在运行时观察变量类型的使用模式,当发现某行代码反复处理相同类型(如整数加法)时,生成特化指令跳过通用查找路径。

  • 机制拆解
  • Python 是动态类型语言,`a + b` 在编译时不知道 a 和 b 的类型。传统实现需要:从对象取类型 → 从类型取加法函数指针 → 调用函数 → 检查参数类型 → 执行运算。
  • 3.11 的做法:每次执行加法时记录操作数的实际类型。如果连续多次都是整数,就生成一个「特化整数加法」指令。该指令仍会检查类型(以防后续出现字符串),但检查路径极短,且统计上 99% 的情况检查通过。
  • 关键设计:如果预测错误(如突然出现浮点数),解释器会回退到通用路径。Guido 承认「理论上可以构造出比 3.10 慢 5 倍的代码,但那极不现实」。
  • 数据链:CPython 是 Python 的参考实现,用 C 语言编写。3.11 的优化全部集中在解释器层面,编译器(将 Python 源码编译为字节码的部分)改动极小。
  • 证伪条件:如果某段代码中同一行加法操作反复切换类型(如整数、浮点数、字符串交替出现),自适应机制会频繁回退,性能可能不升反降。但 Guido 认为「现实代码中这种模式极为罕见」。

独到之处:Guido 用「天气预测」类比——假设明天的天气和今天一样,这个简单启发式已经比随机猜测好得多。Python 3.11 的优化本质上就是「假设下一行代码的行为和上一行一样」,这是动态语言性能优化的核心哲学。


三、类型提示的现状与未来:实验室而非语言核心

Guido van Rossum 认为,类型提示(PEP 484)是 Python 生态中「最活跃的实验场」,但短期内不会成为语言核心的一部分。目前 20-30% 的 Python 3 代码库使用类型提示,主要用于大型公司的持续集成流程。

  • 历史脉络:类型提示的语法(如 `def foo(x: int) -> str:`)在 Python 3.0 就已预留(函数注解),但直到 PEP 484(2014 年)才明确用途。Guido 与芬兰开发者 Jukka Lehtosalo 在 2013 年 Python 大会上达成妥协:使用现有注解语法,避免引入尖括号(如 C++ 泛型)等破坏性变更。
  • 机制拆解
  • 类型提示是「可选的、运行时可自省的」——注解信息在运行时可通过 `__annotations__` 访问,但解释器用它做任何优化或检查。
  • 静态类型检查器(如 MyPy、Pyre、PyType、PyRight)是独立工具,在开发阶段运行。Guido 强调「如果解释器开始强制类型注解,许多现有 Python 程序会崩溃,因为注解可能包含谎言」。
  • 竞争格局
  • MyPy(原始检查器,Python 编写)仍最流行,但 Google(PyType)、Facebook(Pyre,OCaml 编写)、Microsoft(PyRight)都开发了自有检查器。
  • Guido 认为「多个检查器并存是好事——它们以每月/每两月发布的速度演进,比 Python 语言本身(每年一次发布)快得多,是语法创新的实验室」。
  • 不确定性:Guido 明确表示「目前没人积极推动将类型检查器集成到语言中」,但「5-10 年后情况可能不同」。

独到之处:Guido 将类型提示的现状类比为「JavaScript 引擎竞争」——多个实现并存推动创新,但语言本身保持中立。这与 TypeScript 的「预处理器模型」形成对比。


四、GIL 的困境与可能的未来:子解释器比无 GIL 更现实

Guido van Rossum 判断,移除全局解释器锁(GIL)的代价可能超过收益,更现实的路径是「多子解释器」方案,预计在 Python 3.12(约一年后)引入。

  • 历史脉络:GIL 是 90 年代早期为快速支持多线程而引入的「捷径」——当时多核 CPU 尚未普及,GIL 让单核上的多线程看起来正常工作。随着多核成为主流,GIL 导致 Python 多线程无法利用多核(所有线程实际运行在单核上)。
  • 机制拆解
  • GIL 的本质是「用一把全局锁保护整个解释器状态」,避免多线程同时修改对象导致数据竞争。代价是任何时刻只有一个线程在执行 Python 字节码。
  • 子解释器方案:每个子解释器运行完全独立的 Python 程序,有自己的 GIL,因此可以真正并行。但子解释器之间不能共享对象,通信成本更高。
  • 无 GIL 方案:Facebook 开发者已开发出「no-GIL」分支,通过大量优化使单线程性能下降可控。但 Guido 认为「维护这种复杂度不划算——GIL 是一个不错的折中点」。
  • 数据支撑:Guido 引用自己关于信号量的博客文章,指出「并发编程的 bug 密度远高于顺序代码——人类大脑不擅长同时跟踪多个执行流」。GIL 实际上保护了开发者免受最糟糕的并发问题。
  • 证伪条件:如果 no-GIL 分支的维护成本能被社区接受,且单线程性能损失控制在 5% 以内,Guido 不排除将其作为 Python 4.0 的核心特性。但他强调「Python 4.0 不会很快到来,且即使到来,语法层面将完全兼容 3.x」。

独到之处:Guido 将 GIL 比作「金发姑娘点」——既不是没有线程(太原始),也不是完全自由线程(太危险)。这一判断与许多追求极致并行的社区观点形成鲜明对比。


五、Python 在 AI/数据科学领域的主导地位:偶然与必然

Guido van Rossum 认为,Python 成为机器学习和数据科学的主导语言,是「右行规则」式的路径依赖与「社区开放文化」共同作用的结果,而非语言本身的设计优势。

  • 历史脉络
  • 90 年代末,劳伦斯利弗莫尔国家实验室的 Paul Dubois 提出「计算引导」概念:科学家需要高级语言来组合 Fortran/C++ 数值库。Python 因其可扩展性成为候选。
  • 哈勃太空望远镜团队在 90 年代末大量使用 Python。NumPy、SciPy 等数组操作库的出现,使 Python 在科学计算领域扎根。
  • TensorFlow、PyTorch 等框架选择 Python 作为用户界面,是因为「科学家已经熟悉 Python」——这是典型的路径依赖。
  • 竞争对比
  • MATLAB 失败的原因不是技术,而是「闭源、高价、缺乏 GitHub 开源文化」——无法形成「病毒式传播」。
  • Perl 曾在 2000 年代初主导生物信息学(正则表达式优势),但未能建立数组运算基础设施。
  • 社区文化:Guido 强调 Python 软件基金会(PSF)的资金「几乎全部用于社区建设,而非开发」——这种「平等主义」文化让个人开发者和小公司也能贡献,形成正向循环。

独到之处:Guido 用「右行规则」类比——Python 在 AI 领域的地位并非最优解,而是「大家碰巧都选了同一边」的结果。这一判断挑战了「Python 因技术优势而胜出」的流行叙事。


提及的标的

标的 嘉宾态度 关键数据
CPython 核心关注 3.11 版本性能提升 10-60%;30 年历史,C 语言实现
MyPy 看好 原始 Python 静态类型检查器;与 PEP 484 共同开发
PyCharm 中性(有保留) 功能最全但「像开 18 轮卡车」;扩展开发困难
VS Code 看好 被视为 Emacs 的「精神继承者」;Guido 日常使用
GitHub Copilot 积极使用 「每天使用,省去大量打字」;但「需要理解代码才能用好」
NumPy/SciPy 正面提及 Python 在科学计算领域扎根的关键基础设施
TensorFlow/PyTorch 正面提及 选择 Python 作为 UI 是因科学家已熟悉 Python

值得记住的判断

1. Guido van Rossum 认为「自适应特化解释器」是动态语言性能优化的核心哲学:假设明天的天气和今天一样——用统计预测替代通用路径,赌大多数情况下变量类型不变。3.11 的 10-60% 提速来自这一思路,而非 JIT。

2. Guido 判断 GIL 是「金发姑娘点」:既不是没有线程(太原始),也不是完全自由线程(太危险)。移除 GIL 的维护成本和单线程性能损失可能超过收益,子解释器是更现实的路径。

3. Guido 指出类型提示短期内不会成为语言核心:目前 20-30% 的 Python 3 代码库使用类型提示,但解释器不强制检查。多个静态检查器(MyPy、Pyre、PyType、PyRight)并存是「语法创新的实验室」。

4. Guido 认为 Python 在 AI 领域的主导地位是「右行规则」式的路径依赖:并非技术最优,而是「大家碰巧都选了同一边」。MATLAB 失败的原因是闭源和高价,Perl 失败的原因是缺乏数组运算基础设施。

5. Guido 将编程语言比作「同时写给计算机和人类的食谱」:计算机需要精确指令,人类需要可读结构。Python 的强制缩进优先服务后者,这是其在新手中流行的关键原因。

6. Guido 提出「BDFL 模式的好处是方向稳定,坏处是个人压力过大」:他承认「应该更早放弃 BDFL 角色」,但继任的指导委员会成功保持了「稳定而不停滞」的演进节奏。

7. Guido 认为「学习编程的最好方法是找一个你想解决的具体问题」:即使是不切实际的问题(如写一个 Reddit 机器人),也比抽象学习语法更有效。他引用「Learn Python in 10 Years」的批评,但认为「1 小时就能让你爱上编程——关键是先爱上,再深入」。

8. Guido 将 VS Code 视为 Emacs 的「精神继承者」:两者都采用「核心引擎 + 可扩展包」架构,VS Code 的包生态系统是 Emacs Lisp 传统的现代版本。这是他加入微软后从 Emacs 转向 VS Code 的原因。