
最近一段时间,我在写 Rust 时突然对 Python 有了一个新认识,虽然我的任务最初需要 Rust 的高性能,但在几处优化后,我用更短的 Python 代码跑出了几乎一样的速度,无意间,我从一条冷门路径切换到了 Python 的“热路径”(hot path)。
当我深入研究后,我发现这样的“热路径”在 Python 生态中比比皆是——这是由无数开发者反复踩出的优化路线,逐渐形成的“高速公路”。
让我惊叹的不仅是找到了一条优化的路径,而是这些组件之间竟然协作得如此顺畅——即使它们最初并非为如此紧密的结合设计。这样的模式似曾相识,甚至无处不在。这种现象让我意识到,Python 远远不止是一个简单的“粘合剂语言”(glue language)。
它并不快。它也不神奇。而且,是的,它总有“崩溃”的极限。
但正因如此,Python 才如此特别。
你可以:
写着写着就睡着,因为代码太轻松了;
轻松导入任何“魔法库” (import any_magic),不管是官方自带还是全球安装的 pip 包;
组合一个“怪兽级”的 FortRust++ 库,用它运行一些来自上古时代的 MMIX 汇编代码;
或者随意执行代码,直到它(可以预见地)崩溃,然后进入解释器,慢慢分析“废墟”中的问题。
奇妙的是,这个过程对于开发的早期阶段居然非常有效!
真正特别的是这一切背后的“组合之美”——它展现了 Python 生态系统如何演化,并是什么驱动了这种演化。
当你写 Python 代码时,你不仅仅是在写“胶水”,而是在探索一个隐式的“即时编译”(JIT)生态系统。
每当某段 Python 路径变得足够“热门”,整个生态就会响应,通过开发出一个全新的组件,将它嵌入现有的体系中。
这种“胶水”并不是静态的,而是动态演变的。它就像一条“愿望路径”(desire path),不断随着生态系统中的使用模式而优化。
Python 的角色不仅仅是连接组件,它还帮我们发现:哪些组件需要被创造。
Python 很慢。但或许,这种“慢”恰恰是我们需要的?
当某段 Python 代码路径慢到不堪重负时,一种看似矛盾的现象发生了:生态系统不会去优化 Python 本身,而是粘合进其他更快的解决方案。
Python 的运行速度慢,但实验速度却很快。开发者像侦察兵一样,在未知的领域中探索“值得铺路”的路径。这些路径追求表达力、易用性和简洁性,而不是性能上的极致优化。因为你知道:你无法赢得性能的战役,所以根本就不去打。
随着某条“路径”被越来越多的用户踩出,生态会自然地为这条路铺设更多的“基础设施”。
这种优化策略是一种涌现的现象,效果往往比任何精心计划都要好得多。
Python 本身就是反“过早优化”的典范。它的设计理念是先跑起来,后面再考虑是否需要让它跑得更快(如果这真的重要的话)。
Python 的 API 通常趋向于帕累托最优:覆盖 80% 的常见用例,同时暴露 20% 的底层功能。这意味着,它不会尝试用“快语言”去重造轮子,而是用最优的解决方案对特定需求进行粘合和集成。
如果 Python 的“粘合”能力不足,我们可以轻松地降低抽象层级,直接调用底层组件。换句话说,即使底层是用“怪兽语言” FortRust++ 写的也没关系,只要 Python API 简单易用即可。
Python 一路跳跃前行,始终优化开发者的体验(易用性、组合能力、简单性等),而非试图占有底层优化的荣耀。它不会嫉妒其他语言的能力,也不想偷走那些精心打磨的库,只专注于将它们完美集成。
在传统的即时编译(JIT)中,程序会在运行时优化“热路径”(即频繁执行的代码片段)。这样,我们既不会在前期浪费时间优化不重要的代码,又能根据程序的实际运行情况找到更优的优化方案。
而 Python 的生态系统,实际上做了类似的事情,但范围更大,发生在整个社区层面。
Python 生态并不是通过单个程序的运行时优化来进化,而是通过整个开发者社区的使用模式来驱动优化。当开发者不断在某些路径上遇到性能瓶颈时,生态系统便会有所响应。
这背后不仅仅是“使用驱动”的结果,Python 的一些特性——例如可读性、包容性、以及自身性能上的“约束”——共同塑造了这种独特的优化动态,这种动态为我们发现和改进热门路径提供了一个开放、可组合、且最终高效的环境。
尽管这种隐式 JIT 生态系统并非 Python 独有,但 Python 的特点放大并加速了这一过程。
机器学习和数据科学领域可能是 Python 隐式 JIT 演化的最佳例证。
当某段慢 Python 代码变得至关重要时,整个生态系统会迅速行动起来,弥补这一结构性缺陷。
比如,Python 对数值计算的需求催生了 NumPy、Pandas 和 Scikit-learn 等基础工具,这些库最初用 C 或 Cython 写成,这为性能奠定了基础,而现在,我们还在探索 Rust 能为这些工具带来什么新可能性。
机器学习框架的演化则更加戏剧化,例如,PyTorch 的出现不是因为 Python 更快,而是因为 Python 的生态系统已经足够成熟,其易用性推动了框架的普及。
还有一个例子是 JAX 的演化。一开始,JAX 的核心理念只是“让 Python 和 NumPy 原生支持自动求导”,而如今,JAX 已经进化成了一套复杂的框架,依然保持着与原始 Python API 的兼容性。
某种意义上,Python,这个“慢”语言,现在却调度着世界上大部分的 FLOPS(每秒浮点运算次数)。
Python 的简洁、包容性、以及渐进式的开发模式正是 LLM(大型语言模型)所需要的特性。
你不会希望一个任务需要超过三行代码:一行导入库,一行配置,一行执行。Python 正好处于这个“最优位置”:
零门槛试用,
一个完全互操作的生态系统,
以及对粗心程序员友好的简单 API。
Python 的解释器不仅是一个粘合器,更可能成为 AI 时代的核心语言之一。
在充当隐式 JIT 生态的催化剂数十年后,Python 终于在 3.13 中尝试了自己的 JIT 编译器,这是一个合适的进化方向。
曾经被我们诟病的“慢”,也许正是塑造整个生态的必要催化剂。
Python 的性能限制不仅创造了一个优化的组件生态,还让我们精准发现了哪些路径需要优化——多一分太慢,少一分不够。
有时候,最快的前进方式就是又快又慢。
原文:https://state.smerity.com/smerity/state/01JC39KW1TBEAZTKJJF0BR5ZXD
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等 推荐阅读
Robyn-基于Rust 运行时的超快速异步Python Web框架
点击 阅读原文 了解更多