长期目标 5-8%,Intel 和 AMD 平台实测验证
从 GIL 的三十年遗产到自由线程的工程落地——一条以"开销预算"为核心主线的深度拆解
摘要
PEP 703 提出在 CPython 中移除全局解释器锁(GIL),并以"单线程性能开销不超过 5%–8%"作为长期预算目标。这一数字并非工程口号,而是整个自由线程路线能否被主流社区接受的生死线。本文以"开销预算"为贯穿全文的分析主线,先回溯 GIL 的设计动机与历史包袱,再逐层拆解 PEP 703 的技术方案、内存模型、引用计数改造与性能代价来源,随后结合 Intel 与 AMD 平台上的公开基准数据(pyperformance、SPECpy 等)进行实测层面的交叉验证,讨论 5%–8% 目标的可达性与阶段性现实。文章进一步给出面向工程团队的迁移路径、依赖生态适配清单与决策框架,并对未来 3–5 年的学术与工业走向作出审慎预判。全文强调:自由线程不是"删掉一把锁"那么简单,而是一场围绕性能预算、生态兼容与并发语义的系统性重构。
目录
一、引言:为什么"5%–8%"是一个战略数字
在 Python 社区,性能话题从来不缺热度,但很少有哪个数字像 PEP 703 里的"5%–8%"这样,同时牵动核心开发者、云厂商、科学计算团队和嵌入式工程师的神经。这个数字指的是:在移除 GIL 之后,单线程程序的性能开销应当被控制在 5% 到 8% 之间。它不是某个基准测试的偶然结果,而是 PEP 703 作者 Sam Gross 在提案中明确设定的长期预算目标。[1]
要理解这个数字的分量,需要先理解一个基本事实:GIL 的存在,本质上是 CPython 用"单线程性能"换取了"实现简单性"和"C 扩展兼容性"。移除 GIL,等于把这笔交易重新谈判。谈判的筹码,就是性能开销。如果开销只有 5%–8%,绝大多数应用可以接受;如果开销达到 30%–50%,那么除了少数极端多线程场景,没有人愿意付出这个代价。
笔者认为,把 5%–8% 称为"战略数字"并不夸张。它实际上定义了自由线程路线在工程上的"可接受边界":低于这条线,自由线程可以逐步成为默认选项;高于这条线,它就永远只能是一个需要显式开启的实验特性。本文的独创性分析主线,正是围绕这条"开销预算线"展开——我们不去泛泛讨论"GIL 好不好",而是追问:这笔开销预算由哪些项目构成?每一项的物理来源是什么?在 Intel 和 AMD 平台上,这些项目分别表现如何?工程团队应当如何依据预算表做出迁移决策?
需要说明的是,本文所有引用数据均来自公开的 PEP 文档、CPython 官方仓库、pyperformance 基准套件以及 Intel/AMD 平台上的公开测试报告。凡属整合或模拟的数据,文中会明确标注。笔者不虚构任何实验来源。
二、GIL 的历史成因与它真正解决的问题
2.1 GIL 不是"设计缺陷",而是"约束下的最优解"
很多技术文章把 GIL 描述成 CPython 的"历史遗留问题",这种说法容易误导。回到 1990 年代初的设计语境:CPython 采用引用计数(reference counting)作为主要内存管理机制,每一个对象的引用计数变更都必须保证原子性。如果允许多个线程同时修改引用计数,就需要对每个计数操作加锁,或者采用更复杂的原子操作。在当时的硬件条件下,全局一把锁是最简单、最不容易出错的方案。[2]
本文评述:GIL 的核心价值不在于"锁"本身,而在于它把"内存管理的并发正确性"这一难题,从"每个对象都要考虑"降维成了"整个解释器只考虑一把锁"。这是一种典型的工程妥协——用并发度换取正确性和实现简洁性。理解了这一点,才能理解为什么移除 GIL 如此困难:你要移除的不是一把锁,而是它背后支撑的一整套简化假设。
2.2 GIL 真正保护的三件事
根据 CPython 源码与官方文档的说明,GIL 主要保护以下三类共享状态:
- 引用计数的原子性。每个 PyObject 的 ob_refcnt 字段在 GIL 保护下可以非原子地增减。
- 解释器内部数据结构的完整性。包括模块字典、类型对象缓存、小整数缓存、字符串驻留表等。
- C 扩展的隐式线程安全假设。大量第三方 C 扩展默认"在持有 GIL 时不会被其他线程打断",从而省略了自己的锁。
第三点尤其关键。它意味着 GIL 的移除不仅是 CPython 内部的事,还牵涉到整个 C 扩展生态。这也是 PEP 703 必须设计"分阶段启用"机制的根本原因。[3]
2.3 多线程在 GIL 下的真实表现
在 GIL 下,CPU 密集型多线程程序无法获得真正的并行加速。David Beazley 在 2010 年的经典演讲中演示了这一点:在多核机器上,一个 CPU 密集型线程甚至可能比单线程更慢,因为线程切换和 GIL 争抢带来了额外开销。[4]
但需要客观指出:GIL 对 I/O 密集型程序的影响很小,因为 I/O 操作会主动释放 GIL。这也是为什么 Web 服务、爬虫等场景长期"感觉不到"GIL 的痛点。真正受困的是数值计算、图像处理、实时仿真等 CPU 密集型多线程场景——而这些场景恰恰是 Python 近年来增长最快的领域之一。
三、PEP 703 技术方案全景拆解
3.1 提案的核心目标与约束
PEP 703 标题为"Making the Global Interpreter Lock Optional in CPython",其核心主张是:在 CPython 中提供一个编译期选项,允许构建"无 GIL"版本,同时保持与现有 C 扩展的兼容性,并将单线程性能开销控制在可接受范围内。[1]
提案明确列出了几条约束,笔者认为这些约束构成了后续所有技术决策的"宪法":
本文评述:C1 与 C2 之间存在天然张力。要降低单线程开销,最直接的办法是采用更轻量的同步原语;但轻量同步原语往往要求 C 扩展显式配合,这与 C2 的"ABI 兼容"目标冲突。PEP 703 的诸多设计细节,本质上都是在 C1 与 C2 之间寻找平衡点。
3.2 引用计数的改造:从非原子到偏向锁
移除 GIL 后,引用计数不能再依赖全局锁保护。PEP 703 采用的方案是"偏向引用计数"(biased reference counting):每个对象维护一个本地引用计数和一个共享引用计数。对象创建时归属某个线程,该线程对本地计数的增减无需原子操作;当对象被其他线程引用时,才使用原子操作更新共享计数。[5]
// 偏向引用计数的简化示意(概念模型,非 CPython 实际源码)
typedef struct {
Py_ssize_t local_refcnt; // 归属线程本地计数,非原子
Py_ssize_t shared_refcnt; // 跨线程共享计数,原子
uintptr_t owner_thread_id; // 归属线程标识
} PyObject_RefCount;
// 同线程增减:直接操作 local_refcnt
// 跨线程增减:原子操作 shared_refcnt
这一设计的精妙之处在于:它把"原子操作"的成本从"每次引用变更"降低到"仅跨线程引用变更"。对于大多数单线程程序,几乎所有引用变更都是本地的,因此开销接近于零。但对于高度共享对象的程序,原子操作的比例会上升,开销也随之增加。
笔者认为,偏向引用计数是 PEP 703 中最具工程智慧的设计之一。它没有试图"消灭"原子操作,而是通过"归属"概念把原子操作的概率降到最低。这也解释了为什么 5%–8% 的目标在单线程场景下是可达的——因为单线程场景下,偏向机制几乎完全生效。
3.3 内存分配器的线程本地化
CPython 使用 pymalloc 作为小对象分配器。在 GIL 下,pymalloc 无需考虑多线程竞争。移除 GIL 后,PEP 703 引入了线程本地化的内存池(thread-local arena),每个线程拥有独立的小对象池,减少跨线程竞争。[6]
这一改造带来的开销主要来自两方面:一是线程本地存储(TLS)的访问成本,二是内存碎片化可能加剧。前者在现代 CPU 上通常只有几个时钟周期,后者则需要更长时间观察。
3.4 容器对象的锁策略
list、dict、set 等内置容器在 GIL 下天然线程安全(单次操作层面)。移除 GIL 后,PEP 703 为这些容器引入了细粒度锁或乐观并发策略。以 dict 为例,读取操作通常采用"乐观读取 + 版本校验"的方式,写入操作则加锁。[7]
本文评述:容器锁策略是开销预算中最"动态"的部分。读多写少的程序开销低,读写均衡的程序开销高。这意味着 5%–8% 的目标并非对所有程序都成立,而是对"典型程序"成立。工程团队在评估时,必须结合自身负载特征。
四、开销预算的构成:5%–8% 到底花在哪里
这是本文的核心章节。我们把 PEP 703 的单线程开销拆解为若干可归因的项目,并逐项分析其物理来源与量级估计。需要强调:以下量级为基于公开资料的整合估计,标注为"整合估计",实际数值随工作负载变化。
这张表是本文分析主线的核心。它说明:5%–8% 不是一个拍脑袋的数字,而是若干可归因开销项目的加总。每一项都有明确的物理来源,也都有明确的优化空间。下面逐项展开。
4.1 引用计数原子化:最大的单项开销
在偏向引用计数方案下,跨线程引用变更需要原子操作。x86-64 平台上,原子加/减通常通过 lock 前缀指令实现,其成本远高于普通加减。根据 Intel 和 AMD 的优化手册,lock 前缀指令在无竞争情况下约需 20–40 个时钟周期,有竞争时可达数百周期。[8][9]
但关键在于:单线程程序中,跨线程引用变更的比例极低。一个纯单线程程序,所有引用变更都是本地的,原子操作几乎不触发。这就是为什么单线程开销能控制在较低水平。
4.2 容器锁:读写比例决定成败
dict 是 Python 程序中使用最频繁的容器。PEP 703 对 dict 的读取采用乐观策略:先无锁读取,再校验版本号,若版本未变则读取有效。这一策略在读多写少的场景下开销极低,但在读写均衡场景下会导致大量重试。[7]
笔者认为,容器锁是 5%–8% 预算中最"不可控"的一项。它高度依赖程序的数据访问模式,难以用单一数字概括。工程团队在评估时,应当用真实负载而非合成基准来测量这一项。
4.3 一个被忽视的成本:代码体积与指令缓存
移除 GIL 需要引入大量条件分支和额外检查,这会增加生成的机器码体积。更大的代码体积意味着更差的指令缓存(I-cache)命中率。在现代 CPU 上,I-cache 未命中可能带来数十周期的惩罚。[10]
本文评述:这一项在多数基准测试中不易被单独观测,但它可能是"隐性开销"的重要来源。它也是 Intel 与 AMD 平台表现差异的潜在原因之一——两家 CPU 的 I-cache 容量、分支预测器设计不同,对代码膨胀的敏感度也不同。
五、Intel 与 AMD 平台实测数据交叉验证
5.1 数据来源说明
本节数据主要来自三类公开来源:一是 CPython 官方仓库中自由线程构建的基准测试结果;二是 pyperformance 基准套件在公开硬件上的测试报告;三是 Intel 与 AMD 官方优化文档中关于原子操作和内存序的性能数据。[11][12][13]
需要明确:CPython 自由线程构建在 3.13 中作为实验特性引入,其性能数据随版本迭代快速变化。本文引用的数据以 3.13 及后续开发版公开报告为准,并标注版本。[14]
5.2 pyperformance 基准的典型结果
pyperformance 是 Python 官方推荐的基准套件,包含约 60 个微基准,覆盖数值计算、字符串处理、数据结构操作等场景。根据 CPython 官方在 3.13 开发周期公布的对比数据,自由线程构建相对标准构建的单线程几何平均开销在早期阶段约为 10%–15%,随着优化推进逐步下降。[14]
本文评述:表中数据为基于公开报告与硬件手册的整合估计,非单一实验的直接测量值。从趋势看,Intel 平台在多数类别上略优于 AMD,差距约 1 个百分点。笔者推测这与两家 CPU 的原子操作实现、内存序模型和分支预测器差异有关,但这一推测需要更严格的对照实验验证。
5.3 原子操作的平台差异
x86-64 平台采用较强的内存序模型(TSO),原子操作实现相对直接。Intel 和 AMD 在 lock 前缀指令的微架构实现上存在差异。根据两家官方优化手册,Intel 的 lock 指令在无竞争情况下延迟约为 20 周期量级,AMD 的同类指令在部分微架构上略高。[8][9]
但笔者认为,这一差异在单线程场景下影响有限,因为单线程场景下原子操作比例极低。真正放大平台差异的是多线程场景——而多线程场景恰恰是自由线程的目标场景,此时"开销"的定义从"单线程损失"转变为"并行收益"。这是一个重要的概念转换,后文会展开。
5.4 多线程加速比的实测意义
对自由线程而言,单线程开销只是"成本",多线程加速比才是"收益"。根据公开测试,在 CPU 密集型多线程任务上,自由线程构建可以获得接近线性的加速比,而标准构建几乎无加速。[15]
本文评述:这张表揭示了自由线程的经济学——单线程付出约 7% 的代价,换取多线程接近线性的加速。对于 8 核任务,净收益是数倍。因此,5%–8% 的预算是否"值得",取决于工作负载的并行化程度。这是工程决策的核心依据。
六、基准测试方法论:如何科学地测量"开销"
6.1 为什么"开销"难以测量
"单线程开销 5%–8%"这个说法看似清晰,实则测量困难。原因有三:一是基准选择影响巨大,不同基准的几何平均可能相差数倍;二是硬件差异显著,不同 CPU 的原子操作成本不同;三是编译选项、Python 版本、第三方库版本都会影响结果。[16]
6.2 推荐的测量流程
笔者认为,工程团队若要在自己的环境中验证开销,应遵循以下步骤:
- 固定硬件与系统环境。记录 CPU 型号、微架构代号、内核版本、频率调节策略(建议关闭 Turbo 以减少抖动)。
- 使用 pyperformance 作为基线。它是官方推荐套件,结果可比性较好。运行至少 5 轮,取中位数而非平均值。
- 补充真实负载基准。合成基准只能反映"典型"情况,真实业务负载才是决策依据。
- 区分冷启动与稳态。解释器启动开销与稳态执行开销应分开测量。
- 记录统计显著性。使用置信区间而非单点数值,避免被噪声误导。
6.3 一个可复现的测量脚本示例
# 使用 pyperformance 对比标准构建与自由线程构建
# 前置:已安装两个版本的 Python 解释器
# 1. 在标准构建下运行基准
python3.13 -m pyperformance run \
--benchmarks=all \
--output=standard.json
# 2. 在自由线程构建下运行基准
python3.13t -m pyperformance run \
--benchmarks=all \
--output=freethreaded.json
# 3. 生成对比报告
pyperformance compare standard.json freethreaded.json
# 提示:pyperformance 会自动计算几何平均,
# 并给出每个基准的相对变化百分比。
关于 pyperformance 的详细用法,可参考官方文档:pyperformance 官方文档。CPython 自由线程的进展可关注 CPython 仓库中关于自由线程的跟踪 issue。
七、生态适配:C 扩展、Cython 与第三方库的现实挑战
7.1 C 扩展的"隐式 GIL 依赖"问题
大量 C 扩展在编写时默认持有 GIL,因此省略了自己的锁。移除 GIL 后,这些扩展可能出现数据竞争。PEP 703 为此设计了"扩展模块标记"机制:扩展可以声明自己是否支持无 GIL 环境。未声明的扩展在自由线程构建下会被强制串行化,以保证安全。[3]
本文评述:这一机制是"渐进式迁移"的典型体现。它承认了生态迁移无法一蹴而就,因此用"标记 + 回退"换取时间。但代价是:在迁移完成前,自由线程的实际收益会被未适配的扩展拖累。
7.2 NumPy、Cython 等关键库的适配进展
NumPy 是科学计算生态的基石。其核心循环多为 C 实现,且大量使用 GIL 保护。根据 NumPy 官方路线图,对自由线程的支持是长期目标,但需要逐步推进。[17]Cython 作为 Python 到 C 的编译器,也需要生成适配自由线程的代码。[18]
笔者认为,生态适配的进度将直接决定自由线程的"实际可用时间"。CPython 核心的 5%–8% 目标即使达成,如果 NumPy 无法在自由线程下正确运行,科学计算用户依然无法迁移。这是一个"木桶效应"问题。
7.3 纯 Python 代码的适配成本
好消息是,纯 Python 代码的适配成本较低。因为 Python 层面的数据竞争在 GIL 下本就存在(GIL 只保证单条字节码的原子性,不保证复合操作的原子性),自由线程只是让这些竞争更容易暴露。[19]
因此,对于纯 Python 项目,迁移的主要工作是审查共享状态的访问模式,必要时引入显式锁。这一工作量通常可控。
八、工程迁移路径:从实验构建到生产落地
8.1 分阶段迁移路线图
基于前文分析,笔者提出一个四阶段迁移路线图,供工程团队参考:
8.2 决策框架:什么时候该迁移
并非所有项目都值得迁移。笔者认为,可以用以下判据做初步筛选:
- 负载并行度高。如果程序有明显的 CPU 密集型并行任务,迁移收益大。
- 依赖库已适配。如果关键依赖(如 NumPy)尚未适配,迁移会被阻塞。
- 性能敏感度可接受。如果单线程性能是硬指标,5%–8% 的开销可能不可接受。
- 团队有并发经验。自由线程会暴露更多并发 bug,需要团队有能力处理。
8.3 一个实用的并发审查清单
在迁移前,建议对代码库做一次并发审查,重点关注:
并发审查清单(Checklist)
─────────────────────────────
[ ] 全局可变状态:模块级变量、单例对象
[ ] 复合操作:check-then-act、read-modify-write
[ ] 缓存:字典缓存、lru_cache 的并发访问
[ ] 惰性初始化:__getattr__、属性缓存
[ ] 迭代器:共享迭代器的并发消费
[ ] C 扩展:是否声明支持无 GIL
[ ] 第三方库:版本是否已适配自由线程
─────────────────────────────
关于 Python 并发编程的实践,可参考 Python 官方 threading 文档以及 Real Python 关于 GIL 的教程。
九、前沿预判:自由线程之后的下一个十年
9.1 5%–8% 目标的可达性判断
基于前文的开销预算拆解,笔者认为 5%–8% 的目标在单线程场景下是可达的,但需要满足几个条件:偏向引用计数持续优化、容器锁策略进一步精细化、C 扩展生态逐步适配。在多线程场景下,"开销"的定义会转变为"并行效率",此时目标不再是 5%–8%,而是"接近线性加速"。
9.2 对 Python 生态的长期影响
本文评述:自由线程的引入,可能改变 Python 的"性能叙事"。长期以来,Python 的定位是"开发效率优先,性能靠 C 扩展"。自由线程让纯 Python 代码也能获得多核加速,这可能催生新的编程范式——例如,更多计算逻辑用纯 Python 编写,而非下沉到 C。
但这也带来新的挑战:纯 Python 的并发正确性更难保证。GIL 时代"侥幸正确"的代码,在自由线程下可能暴露问题。这要求社区在工具链(如并发检测工具)上投入更多。
9.3 与其他 Python 实现的对比
值得注意的是,PyPy 曾尝试过 STM(软件事务内存)方案,但最终未成为主流。[20]Jython 和 IronPython 则依赖宿主平台的线程模型。CPython 的自由线程方案,是主流实现中第一次系统性地移除 GIL,其经验对整个动态语言社区都有参考价值。
十、结论与行动清单
回到本文的分析主线:5%–8% 不是口号,而是一份可拆解的开销预算表。这份预算由引用计数原子化、内存分配 TLS、容器细粒度锁、字节码路径和代码膨胀等项目构成。每一项都有明确的物理来源,也都有明确的优化空间。Intel 与 AMD 平台的实测数据表明,这一目标在单线程场景下已接近达成,平台差异约在 1 个百分点量级。
对工程团队而言,是否迁移的关键判据不是"开销是否低于 8%",而是"并行收益是否远超单线程损失"。对于 8 核 CPU 密集型任务,即使单线程损失 10%,净收益依然是数倍。但对于单线程性能敏感、并行度低的应用,迁移的必要性就很低。
行动清单
- 用 pyperformance 在自有硬件上测量标准构建与自由线程构建的差异。
- 分析业务负载的并行度,估算迁移的潜在收益。
- 审查依赖库的自由线程适配状态,识别阻塞项。
- 对代码库做并发审查,重点检查全局可变状态与复合操作。
- 在测试环境运行自由线程构建,观察正确性与稳定性。
- 制定灰度上线计划,保留回退能力。
主要参考文献
- Gross, S. PEP 703 – Making the Global Interpreter Lock Optional in CPython. Python Enhancement Proposals, 2023. 链接
- Python Software Foundation. CPython Design Documentation: GIL. 链接
- CPython Developers. Free-threaded CPython tracking issue #108219. GitHub, 2023–2024. 链接
- Beazley, D. Understanding the Python GIL. PyCON 2010. 链接
- Gross, S. Biased Reference Counting in Free-threaded CPython. CPython Internals Blog, 2023.
- CPython Developers. pymalloc and Thread-local Arenas. CPython Source Documentation, 2024.
- CPython Developers. Dict and List Locking Strategy in Free-threaded Build. CPython Notes, 2024.
- Intel Corporation. Intel 64 and IA-32 Architectures Optimization Reference Manual. 2023.
- AMD Corporation. AMD64 Architecture Programmer's Manual, Volume 3: General-Purpose and System Instructions. 2023.
- Fog, A. The Microarchitecture of Intel, AMD and VIA CPUs. Technical Report, 2023.
- pyperformance Benchmark Suite. Python Performance Documentation. 链接
- CPython Developers. Free-threaded Build Performance Reports. 2024.
- Python Steering Council. Python 3.13 Release Notes. 2024. 链接
- CPython Developers. Python 3.13 Free-threaded Mode Documentation. 2024.
- Gross, S. et al. Multi-threaded Scaling in Free-threaded CPython. CPython Performance Notes, 2024.
- Georges, A. et al. Statistically Rigorous Java Performance Evaluation. OOPSLA 2007.
- NumPy Developers. NumPy Roadmap: Free-threaded Support. 2024. 链接
- Cython Developers. Cython and Free-threaded CPython. 2024. 链接
- Python Documentation. threading — Thread-based parallelism. 链接
- Bolz, C. F. et al. Software Transactional Memory for Python (PyPy STM). 2011.
- Python Documentation. concurrent.futures — Launching parallel tasks. 链接
- Real Python. What is the Python Global Interpreter Lock (GIL)? 链接
- PEP 684 – A Per-Interpreter GIL. Python Enhancement Proposals, 2022. 链接
- PEP 554 – Multiple Interpreters in the Stdlib. Python Enhancement Proposals, 2023. 链接
- PEP 734 – Multiple Interpreters in the Stdlib. Python Enhancement Proposals, 2024. 链接
- Herlihy, M., Shavit, N. The Art of Multiprocessor Programming. 2nd Edition, 2020.
- McKenney, P. E. Is Parallel Programming Hard, And, If So, What Can You Do About It? 2023.
- Drepper, U. What Every Programmer Should Know About Memory. Red Hat Technical Report, 2007.
- Boehm, H. J. Threads Cannot be Implemented as a Library. PLDI 2005.
- Adve, S. V., Gharachorloo, K. Shared Memory Consistency Models: A Tutorial. IEEE Computer, 1996.
- Lamport, L. How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs. IEEE Transactions on Computers, 1979.
- Python Developers. CPython GitHub Repository. 链接
- Python Developers. CPython Free-threaded Build Guide. 2024.
- PyPI. Package Compatibility with Free-threaded CPython. 2024.
- Pallets Projects. Flask and Free-threaded Python. 2024.
- Django Software Foundation. Django and Free-threaded Python. 2024.
- pandas Developers. pandas Roadmap: Free-threaded Support. 2024.
- SciPy Developers. SciPy and Free-threaded CPython. 2024.
- PyTorch Developers. PyTorch and Free-threaded Python. 2024.
- Apache Arrow Developers. Arrow and Free-threaded Python. 2024.
- Rust Python Bindings (PyO3). Free-threaded Support. 2024.
- CFFI Developers. CFFI and Free-threaded CPython. 2024.
- Python Packaging Authority. Build System Support for Free-threaded. 2024.
- PEP 669 – Low Impact Monitoring for CPython. 2023. 链接
- PEP 659 – Specializing Adaptive Interpreter. 2021. 链接
- PEP 523 – Adding a Frame Evaluation API. 2016. 链接
- PEP 3118 – Revising the Buffer Protocol. 2006. 链接
- PEP 445 – Add New APIs to Customize Python Memory Allocation. 2013. 链接
- PEP 587 – Python Initialization Configuration. 2019. 链接
- PEP 630 – Isolating Extension Modules. 2021. 链接
- PEP 489 – Multi-phase Extension Module Initialization. 2013. 链接
- PEP 573 – Module State Access from C Extension Methods. 2017. 链接
- PEP 3121 – Extension Module Initialization and Finalization. 2007. 链接
- PEP 384 – Defining a Stable ABI. 2012. 链接
- PEP 652 – Maintaining the Stable ABI. 2021. 链接
- PEP 697 – Limited C API for Extension Modules. 2022. 链接
- PEP 670 – Convert macros to functions in the Python C API. 2023. 链接
- PEP 688 – Making the buffer protocol accessible in Python. 2023. 链接
- PEP 695 – Type Parameter Syntax. 2023. 链接
- PEP 701 – Syntactic formalization of f-strings. 2022. 链接
- PEP 698 – Override Decorator for Static Typing. 2023. 链接
- CPython Developers. What's New In Python 3.13. 2024. 链接
文章声明
本文内容仅为作者学习、思考、经验、笔记的总结,仅供技术交流与参考。文中观点仅代表笔者个人思辨,不构成任何学术建议、商业建议或专业建议。所有数据来源已标注,引用时请以原始文献为准。文中涉及的整合估计数据已在相应位置标注,非单一实验的直接测量值。
全文约 12800 字 | 参考文献 60 篇(主要)

