Python 3.13 引入了新的实验性自由线程(no-GIL)模式,旨在通过移除全局解释器锁 (GIL) 来提升 Python 性能,尤其是在多线程应用程序中。
近日,开发者使用 Python 3.12、3.13 和支持自由线程的 3.13( 3.13t )运行了基准测试,包括使用和不使用 GIL,以及同时运行支持和不支持自由线程的 3.13 版,以评估不同场景下「自由线程」对性能的影响。
https://codspeed.io/blog/state-of-python-3-13-performance-free-threading
以下是此次性能测试的关键点总结:
- GIL 及其局限性: CPython 中的 GIL 通过只允许一个线程在任何给定时间持有 Python 解释器的控制权来限制真正的并行性。这导致了多线程 CPU 密集型应用程序的瓶颈。
- 自由线程( no-GIL)模式: Python 3.13 引入了一个没有 GIL 的实验性构建,允许多个线程真正并发地执行 Python 字节码。这有可能显著提高多核系统上 CPU 密集型任务的性能。
- 性能改进: 早期基准测试表明性能有所提升,尤其是在 I/O 密集型操作和特定场景中。但是,整体性能影响仍在评估中,预计在未来版本中会有所改进。文章使用 PageRank 算法作为案例,展示了在不同并发模型下的性能对比。
- 兼容性问题: 移除 GIL 会引入重大的兼容性挑战。许多 C 扩展和库依赖 GIL 来保证线程安全。使它们适应无 GIL 的世界是一项艰巨的任务。
- 实验状态: Python 3.13 中的 no-GIL 构建明确处于实验阶段。它尚未准备好用于生产环境,并且可能会发生变化。目标是收集反馈并在后续版本中改进实现。
测试结果
数据分析
- 单线程: 作为基准,单线程执行时间被设为 1 个单位时间。
- 多线程 (GIL): 在 4 核机器上使用标准的多线程(受 GIL 限制),PageRank 算法的执行时间为 1.05 个单位时间,比单线程略慢。这表明 GIL 阻碍了并行执行,甚至引入了额外的开销。
- 多进程: 使用多进程,执行时间为 0.35 个单位时间,实现了约 3 倍的加速。这是因为多进程绕过了 GIL 的限制,实现了真正的并行计算。
- 自由线程 (无 GIL): 使用自由线程,执行时间为 0.4 个单位时间,也实现了显著的加速,与多进程方法接近。这表明移除 GIL 可以有效提高多线程程序的性能。