京公网安备 11010802034615号
经营许可证编号:京B2-20210330
Python猫注:在今年5月的 Python 语言峰会上,Guido van Rossum 作了一场《Making CPython Faster》的分享(材料在此),宣告他加入了激动人心的“香农计划”,旨在 4 年内提升 Python 性能至 5 倍。近日,Guido 上了一档英文播客节目(时长 30 分钟),谈论了他正在做的与高性能相关的工作,解答了几个问题。播客作者整理了一份内容纪要,本文是对该纪要的翻译。
作者:Software at Scale
译者:豌豆花下猫
Guido:在某种意义上,它对我来说是一个相对舒服的话题,因为这意味着与 Python 的核心打交道,而我对这方面还算熟悉。当我在微软工作时,我曾短暂地关注过 Azure,但我意识到我在谷歌或 Dropbox 时就不喜欢这类工作。然后我关注了机器学习,但这需要花很多时间来做一些与 Python 无关的事情,甚至它与 Python 相关的部分就很少。
Guido:我喜欢他思考问题的方式。大多数其它聚焦于 Python 性能的方法,如 PyPy 和 Cinder,并不适用于所有的使用场景,因为它们不能向后兼容扩展模块。Mark 具有 CPython 开发者的视角和经验,并且有一种可行的方法来维持向后兼容性,这是最难解决的问题。Python 的字节码解释器经常要在小版本之间(例如 3.8→3.9)进行修改,原因有很多,比如新的操作码,所以修改它是一种相对安全的方案。
Guido:当执行一个程序时,你不知道它会在运行了几分之一毫秒后崩溃,还是会持续运行三周时间。因为对于同一份代码,在第一种情况下,它可能触发了一个 bug。如果运行程序需要三周时间,也许提前半小时优化所有待运行的代码是有意义的。
但很明显,特别是在像 Python 这样的动态语言中,我们尽可能多地做,而不要求用户告诉我们他们到底需要怎么做,你只是想尽快开始执行代码。所以,如果有一个小脚本,或者一个大程序,它碰巧执行失败了或者因为某些原因提前退出了,你就不用花费时间去优化全部的代码了。
所以,我们要做的就是保持字节码编译器的简单化,以便能尽快地开始执行代码。如果有某些函数被多次执行,那么我们就称其为 hot 函数。“hot”存在多种定义。在某些情况下,如果一个函数被调用超过一次,或者超过两次,或者超过 10 次,那么它被定义成一个热门函数。而在其它保守的情况下,你可能说“只有被调用 1000 次才算 hot”。
然后,当参数的类型是某些特定类型时,专门化的自适应编译器(PEP-659 Specializing Adaptive Compiler)会尝试用更快的字节码来替换某些字节码。一个简单的假想的例子是 Python 中的加号运算符,它可以令很多对象相加,比如整数、字符串、列表,甚至元组。但是,你不能将整数与字符串相加。
因此,优化的方法就是提供一个单独的“两个整数相加”的字节码,它是一个对用户隐藏的第二层字节码。(“优化”通常被称为加速 quickening,但一般在我们的语境中,我们称之为专门化 specializing)。这个操作码假设它的两个参数都是真正的 Python 整型对象,直接读取这些对象的值,并在机器寄存器中将这些值相加,最后将结果推回堆栈。
两个整数相加的操作仍然需要对参数进行类型检查。因此,它不是完全不受约束的,但这种类型检查相比于完全泛化的面向对象的加号操作,前者在实现上要快得多。
最后,有可能一个函数被整型参数调用了数百万次,然后突然一小段代码用浮点型参数调用它,或者出现更糟的情况。此时,解释器会直接执行原始的字节码。这是一个重要的部分,让你始终能得到完整的 Python 语义。
Python猫注:“香农计划”的最终目标是将解释器的执行过程分层,并对不同层做出定制的优化。
Guido:即时编译的方案有一大堆我们想要避免的情感包袱。比如,我们不清楚到底编译什么,以及什么时候编译。在程序开始执行之前,解释器将源代码编译成字节码,然后,再将字节码转换为专门的字节码。这意味着,所有的事情都在运行时的某个时刻发生,那么,哪个部分是所谓的即时(Just-In-Time)呢?
另外,人们通常认为 JIT 会自动地使所有代码变得更好。不幸的是,你通常无法真正地预测代码的性能。由于有现代的 CPU 和它们神奇的分支预测,我们已经拥有了足够的性能。例如,我们以一种本认为能够明显减少内存访问次数的方式,编写了一份代码。但是,当对它进行基准测试时,我们发现它的运行速度与旧的未优化代码一样快,因为 CPU 在没有我们任何帮助的情况下,计算出了优化的访问模式。我希望我知道现代 CPU 在分支预测和内联缓存方面做了什么,因为这就像是魔法一般。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在Python面向对象编程(OOP)中,类方法是构建模块化、可复用代码的核心载体,也是实现封装、继承、多态特性的关键工具。无论是 ...
2026-02-27在MySQL数据库优化中,索引是提升查询效率的核心手段—— 面对千万级、亿级数据量,合理创建索引能将查询时间从秒级压缩到毫秒级 ...
2026-02-27在数字化时代,企业积累的海量数据如同散落的珍珠,若缺乏有效的梳理与分类,终将难以发挥实际价值。CDA(Certified Data Analys ...
2026-02-27在问卷调研中,我们常遇到这样的场景:针对同一批调查对象,在不同时间点(如干预前、干预后、随访期)发放相同或相似的问卷,收 ...
2026-02-26在销售管理的实操场景中,“销售机会”是核心抓手—— 从潜在客户接触到最终成交,每一个环节都藏着业绩增长的关键,也暗藏着客 ...
2026-02-26在CDA数据分析师的日常工作中,数据提取、整理、加工是所有分析工作的起点,而“创建表”与“创建视图”,则是数据库操作中最基 ...
2026-02-26在机器学习分析、数据决策的全流程中,“数据质量决定分析价值”早已成为行业共识—— 正如我们此前在运用机器学习进行分析时强 ...
2026-02-25在数字化时代,数据已成为企业决策、行业升级的核心资产,但海量杂乱的原始数据本身不具备价值—— 只有通过科学的分析方法,挖 ...
2026-02-25在数字化时代,数据已成为企业核心资产,而“数据存储有序化、数据分析专业化、数据价值可落地”,则是企业实现数据驱动的三大核 ...
2026-02-25在数据分析、机器学习的实操场景中,聚类分析与主成分分析(PCA)是两种高频使用的统计与数据处理方法。二者常被用于数据预处理 ...
2026-02-24在聚类分析的实操场景中,K-Means算法因其简单高效、易落地的特点,成为处理无监督分类问题的首选工具——无论是用户画像分层、 ...
2026-02-24数字化浪潮下,数据已成为企业核心竞争力,“用数据说话、用数据决策”成为企业发展的核心逻辑。CDA(Certified Data Analyst) ...
2026-02-24CDA一级知识点汇总手册 第五章 业务数据的特征、处理与透视分析考点52:业务数据分析基础考点53:输入和资源需求考点54:业务数 ...
2026-02-23CDA一级知识点汇总手册 第四章 战略与业务数据分析考点43:战略数据分析基础考点44:表格结构数据的使用考点45:输入数据和资源 ...
2026-02-22CDA一级知识点汇总手册 第三章 商业数据分析框架考点27:商业数据分析体系的核心逻辑——BSC五视角框架考点28:战略视角考点29: ...
2026-02-20CDA一级知识点汇总手册 第二章 数据分析方法考点7:基础范式的核心逻辑(本体论与流程化)考点8:分类分析(本体论核心应用)考 ...
2026-02-18第一章:数据分析思维考点1:UVCA时代的特点考点2:数据分析背后的逻辑思维方法论考点3:流程化企业的数据分析需求考点4:企业数 ...
2026-02-16在数据分析、业务决策、科学研究等领域,统计模型是连接原始数据与业务价值的核心工具——它通过对数据的规律提炼、变量关联分析 ...
2026-02-14在SQL查询实操中,SELECT * 与 SELECT 字段1, 字段2,...(指定个别字段)是最常用的两种查询方式。很多开发者在日常开发中,为了 ...
2026-02-14对CDA(Certified Data Analyst)数据分析师而言,数据分析的核心不是孤立解读单个指标数值,而是构建一套科学、完整、贴合业务 ...
2026-02-14