Python 发展史:众人的语言(第二卷)
卷二:新常态与长加速(2013—2025)
这一卷里,Python 不再只是一门“语言”,它同时是分发生态、类型系统、运行时工程、社区治理的复合体。我们把镜头拉近:看人,看会场里的白板,看邮件列表上的折返跑。
第一章 打包之城的工人们(2013—2016)
清晨的 CI 机器像一排同时亮起的路灯。新来的实习生把 setup.py
打开,眉头皱成一个括号。
“为什么我在 macOS 上打好的包,Linux 用户装不了?”
资深维护者耸耸肩:“因为我们还在搬家。”
“搬去哪儿?”
“搬到一座叫 wheel 的城里。”
他们在聊天室里画了一张草图:源码包像平房,到了哪儿都得现场砌砖、拌水泥;wheel 像预制件,一车一车卸下,拧螺丝就能住。这张图贴在团队的 wiki 首页,标题写着:
“让安装像解压,不像编译。”
与此同时,另一队工人把一条新铁路铺向城外:pyproject.toml
。它把“用什么后端构建、需要哪些依赖”写进一个公共契约里。几十个项目不再各说各话,构建系统第一次被端上台面。
某个周末,志愿者在社区直播里演示:“看,pip
现在可以开箱即用,不用再问‘怎么装 pip’。”弹幕里刷起一行行“终于”。
那几年,论坛上的“安装失败”帖子明显变少。人们偶尔还会怀念过去那种“把编译错误抄下来问人”的社交,但更多人松了口气:工具变好时,叙旧就靠聚会,不必靠痛苦。
第二章 笔记本与显卡(2014—2018)
旧教室的投影幕布上,Jupyter 的 logo 亮着。老师在格子间里敲了三行 Python,图就冒出来了。孩子们的眼睛比屏幕更亮。
同一时间,另一座城市里,数据科学家的办公室装上了新的空调,因为显卡在夜里会让房间升温。NumPy/Pandas/Matplotlib 把数字变成表和图,scikit-learn 把算法变成稳妥的接口。后来,PyTorch 与 TensorFlow 带着深度学习的热浪席卷而来。
“你看,”研究员指着一个只有几十行的 notebook,“这不是玩具,这是论文可以复现的脚手架。”
Python 的故事线在这里岔成了两条:
- 一条通向课堂,让第一次“会编程”的体验变得友好;
- 一条通向机房,让大规模计算有了人类语言的外套。
两条线在 pip install
的那一刻会合——当装包不再是一场冒险,实验就能更快开始。
第三章 语法与类型的慢雕刻(2015—2019)
有个传说:一次 PyCon 的午餐桌上,几位维护者把餐巾纸摊开,写下了三个愿望:
- 让字符串像对话那样自然;
- 让“值对象”不再写一堆样板;
- 让大规模代码库在不牺牲动态性的前提下获得静态工具的好处。
后来它们分别变成了 f 字符串、数据类、类型提示。
类型系统的道路从来是渐进的。最初的注解像给读者留的便条,随后工具出现,把便条读成规则;规则又反过来帮助重构。团队里最怀疑类型的人,往往是最后一个撤下怀疑目光的人——当他第一次点“重命名”,看到 IDE 没有漏网之鱼。
语法的改变,则像给熟悉的琴键换上更柔的触感:同样的旋律,手指更轻;而读者在评审里,也更快看懂了作者的意图。
第四章 分岔口与方向盘(2018)
那封邮件发出的上午,世界并没有塌。人们先是愣住,然后在走廊里相互拍拍肩膀。有人说:“我们一起把方向盘接过来。”
会议结束时,墙上的便签纸被贴成了一个五边形——并非巧合,Steering Council 将由五人组成。它并不天天转动方向盘,更多时候,它坐在副驾驶座,只有在雾太浓的时候,才轻轻扶一把。
社区从“个人魅力驱动”转向“制度托底”,就像城市从消防队依赖老队长,过渡到用更好的消防法与建筑规范。这不是告别开拓者,而是让开拓可以持续。
第五章 年度十月与新工具(2019—2021)
十月成了一个节日。有人做了杯子,上面印着一个年轮。年更节奏让预期稳定,团队的路线图也更容易跟社区对齐。
某个版本里,zoneinfo
搬进了标准库;结构化模式匹配 让“按形取意”的写法从学术走到日常。白板上画出 match/case
的树,人们发现,过去需要一堆 if/elif 的地方,读起来终于像一个“句子”。
在工具链一侧,pyproject.toml
的小册子被打印成一本本口袋书。你可以在 setuptools
和 poetry
之间切换,或试试更轻的 flit
、pdm
——分歧不再是分裂,因为协议统一。
第六章 更快这件小事(2022—2023)
“更快”在 Python 的语境里,常常意味着**“在不破坏可读性的前提下”**。一个由编译器与解释器工程师组成的小队,把“常见路径”用记号笔圈起来:
- 读取属性、调用方法;
- 算数、比较;
- 局部变量、全局变量的查找。
他们用一种专用化且可回退的方式,让解释器在运行中观察、下注、再根据事实收回或加码。不是一步登天,而是把楼梯的每一阶都垫高一厘米。
结果:基准图上的许多条蓝线整体下移。不是每个任务都提速惊人,但**“一切如常地更快一点”**,这句承诺兑现了。
第七章 线程与锁(2023—2025 的前夜)
大楼里最老的一扇门上写着三个字母。很多人第一次听说它是在面试题上:
“请解释 GIL。”
年轻的维护者在笔记本上写下三个问题:
- 多核并行对 Python 来说究竟意味着什么?
- 如果某一天这扇门真的被卸下,代价是什么?
- 我们该如何在不惊动住户的前提下,先把楼里的配电箱和消防通道升级一遍?
接下来几年,工程团队像装修队一样先做了看不见的工作:
-
按每解释器粒度重构状态;
-
明确和收拢一些历史悠久的 C-API;
-
给调试与监控留出更安全的接口。
到了某个版本,自由线程的预览构建被放在“试试看”的台子上。文档上用粗体写着:
“这还不是终点,请把你发现的问题告诉我们。”
大厅里并没有鞭炮,只有一张排期表被画得更密。人们知道,这种改变不靠喝彩,靠回归测试。
第八章 众人的语言(尾声·未完待续)
某个周末黑客松上,一个高中生用 Python 做了第一个小游戏;隔壁桌的研究生用 Python 复现了一篇论文;再隔壁,一个架构师把一个十年的单体服务拆成了几个相互解耦的包,README 里最醒目的部分是安装说明只有一行。
语言走到这里,已经很难再被单个名词概括。它是课堂,是工地,是实验室,也是舞台。你可能在它的某一侧待得更久,但转身的那一刻,总能看见别的侧面还亮着灯。
下一节,我们将把镜头推进到 2021—2025 的关键发布与生态转折:结构化模式匹配的落地影响、Faster CPython 的工程细节剖面、自由线程路线与 C 扩展生态的协作,以及数据科学与生成式 AI 对工具链与运行时的“倒逼”。
卷二·下:2021—2025 的新地基
这一段像连续剧:每年十月的片头卡字幕一闪而过,镜头里却是不同的人在同一条装配线上接力。
第九章 结构化模式匹配:把“以形断意”写进语法(2021)
会议室的门轻轻合上,白板上只剩三行字母:PEP 634/635/636。有人说,“我们其实在做一件老练的事,把编译器里熟悉的匹配借给日常用户。”
3.10 的秋天,match/case
走进舞台中央。第一次使用它的人常常会心一笑:
|
|
读起来就像“判词”——不是比较值,而是辨认形。讨论区里也有担心:“会不会被滥用成奇技淫巧?”最终大家达成了一个朴素的准则:用它解决本来杂乱的 if/elif 嵌套,而不是去追求巧妙。
从这天起,Python 的句法谱系里,多了一支兼具古典与现代气息的旋律。
第十章 类型的扩容:从边注到骨架(2021—2024)
类型提示这条线继续向前推。工程师把一沓 PEP 摊在桌上,像翻施工图:
- PEP 646 变长泛型:为
*args
/张量形状等“数量可变的类型”打开闸门; - PEP 695 类型形参语法:把
T
这类“模板字母”收纳回函数/类定义的就地声明里; - PEP 692 用
TypedDict
精确标注**kwargs
:把“散落的关键字参数”变成可检查的“表格”; - PEP 696 类型参数默认值:在 3.13 里让一些冗长的注解学会省略。
办公室里那位一开始排斥类型的人,如今在评审里最严格。他说:“类型系统不是拦路虎,是安全带。不系也能开,但刹车时你会感激它。”
而 IDE 与 LSP 的团队在另一边加班:Pyright、Mypy、Pylance、Ruff 等工具迅速跟进,让“渐进式类型”在大厂的大仓库里可用、在小团队的代码里也不唐突。几年前“能不能类型化 **kwargs
”的抱怨,如今可以用一段 TypedDict
静静地回答。
第十一章 解释器的加速器:专用化与回退(2022—2023)
那是一块写满箭头的白板,中间四个字母:PEP 659。思路简单到朴素:大多数代码在运行时是稳定的,那就让解释器去观察,再给这些稳定路径铺上更窄但更快的车道。
- 观察:第一次遇到某条字节码,先用“通用模式”执行;
- 下注:看见它老老实实地总是做同一件事(比如两个
float
相加),就换成专用化的变体; - 回退:一旦事实改变,就退回通用;
- 再来:等待下一次稳定。
没有烟火,却有长期主义的耐心。3.11 发布时,讲者把“启动更快、帧更轻、调用内联”的清单放在投影上;走出会场的人在地铁上刷到新闻标题“Python 变快了”,笑着点了个赞。
第十二章 3.12:把工具放在更顺手的地方(2023 秋)
如果你在 3.12 的时代第一次接触 Python,可能会下意识地觉得“它本来就该这样”:
- f 字符串的文法被正式落地,从此在
{...}
里几乎任何合法表达式都能优雅地存在; - 推导式内联,把那点原本的函数开销抹平;
sys.monitoring
为调试与分析打开了低开销通道,工具作者可以不再为“打开调试就变慢十倍”而愁眉;- 每解释器 GIL 出现在 C-API:同一进程里并排跑起多个解释器,各自拿着各自的锁。
这不是“天翻地覆”,更像把工具从抽屉深处移到案头。新人更少被绊倒,老手更容易下潜。
第十三章 3.13:新 REPL、自由线程与轻量 JIT(2024 秋)
十月的发布会像秋收的集市。3.13 端出三个让人眼前一亮的“展品”:
- 全新 REPL:多行编辑、块级回溯、历史模式、贴贴智能。那些年你依赖 IPython 的许多顺手之处,官方解释器补齐了;
- 自由线程(实验):在特定构建里,解释器可以无 GIL地奔跑。它还不是默认,也还不完美,但第一次,**“真正并行的 Python 线程”**不再只是 PPT;
- JIT(实验):在专用化解释器之上加了一层轻巧的即时代码生成功能,像给常走的街道铺上更平的石砖。
那几周,社区像研究院也像厨房:有人测基准、有人修扩展、有人写迁移指南、有人把多线程老库在新世界里试着跑起来。**“谨慎乐观”**成了群聊里的口头禅。
第十四章 打包的第二次现代化:速度、签名与一体化(2022—2025)
如果把 2013—2016 的 wheel/pyproject 叫“第一次现代化”,那么 2022 之后是第二次:
- 供应链安全 成为主角:仓库侧逐步部署仓库签名与更严格的账号安全政策;维护者侧从“建议开启 2FA”走到“强制 2FA”;对恶意包与过期域的治理从被动响应转为主动围栏;
- 工具一体化与提速:一批新工具把“包安装、依赖锁定、虚拟环境、Python 版本管理、发布与运行工具”揉成一把瑞士军刀,把安装速度从“等一会儿”缩短到“眨眼间”。
一位 DevOps 在团队例会上说:“我们不是在‘折腾新玩意’,而是在把时间还给工程。”新入职的同学第一次在 CI 日志里看到“一次构建多处复用的全局包缓存”,下意识地点开看了两次,确认自己没看错。
第十五章 教室、论文与生产的三角(2020—2025 的连线)
Jupyter 教室里,讲师把“错误提示更聪明”的截图投上墙;实验室里,研究员把“变长泛型”写进张量库的类型注解;生产线上,后端团队把“类型参数默认值”用在公共泛型接口上,让新同事的注解一下子短了三分之一。
同一门语言在三角的三个顶点同时发力:
- 在教室,语法与错误消息更亲和,学生更早“做对事”;
- 在论文,生态与数值库继续繁荣,notebook 是实验的“活文档”;
- 在生产,解释器的提速与打包/安全的稳步改进,让“升级版本”这件事从风险操作变成例行保养。
第十六章 治理的细水长流(2019—2025)
Steering Council 的工作像城建委:不是天天剪彩,而是把一堆看不见的流程与依赖理顺。年更节奏成为共识,弃用与移除的周期更可预期;PEP 流程在“开放讨论—试验性落地—稳态纳入”的循环里推进。人们逐渐习惯了一种温和的确定性:
“十月见。”
第十七章 从“GIL 课堂”到“并行工地”(2024—2025)
自由线程的预览点亮后,真正的工作才开始:
- C-API 与扩展生态:哪些接口需要变更,哪些习惯需要拆分,哪些对象语义必须明确“跨解释器不可共享”?
- 性能曲线:单线程会有回退,但多核能标定出真实增益;
- 调试与诊断:有没有更直接的监控点,能看见线程与解释器之间的关系?
工作像加固桥梁:一颗一颗把铆钉打实。维护者们把“默认仍有 GIL,预览供实验”写在显眼处,同时邀请生态作者来“上桥测载”。没有人轻率许诺“明年默认自由线程”,但每个人都在为那一天预留空间。
第十八章 尾声:众人的语言,仍然在路上(2025)
深夜的开放空间里,清洁工推着车从一排排工位前走过。屏幕上,有人还在写 match
的模式;有人给 notebook 加注释;有人在新 REPL 里复制上一段代码做实验;还有人把一条“某个扩展在自由线程下的竞态”记录进 issue。
三十多年后,Python 的气质基本没变:
-
偏向读者:可读性是第一人称视角;
-
偏向工具:把能力放到更顺手的位置;
-
偏向社区:当冲突出现,靠流程消解,而不是靠吼声压制。
“历史”并没有写完。十月的日历页永远还留着空位。人们抬头看看,又低头在键盘上继续敲:下一次改变,最好依旧是把‘难事’悄悄地变简单。
卷二结束|下一卷预告
卷三将转向专题式叙事:
- 多实现的交响:CPython、PyPy、MicroPython 与专用解释器在不同场景的分工与互补;
- 数据与 AI 的互相塑形:数组、分布式、加速与编译在 Python 生态里的波纹;
- 打包与供应链:从 wheel 到仓库签名、从 manylinux 到一体化工具的演进;
- 并行的终章与后记:自由线程路线从实验到支持的路径、生态的适配与“安全默认”。