
Python 3.15.0 在 10 月 9 日正式发布。不少人可能更关心 GIL 这次有什么变化。毕竟“天下苦 GIL 久矣”:如果它不再限制 Python 线程并行执行,CPU 密集型程序就有机会通过多线程利用多个 CPU 核心。
我翻了官方更新说明。3.15 的无 GIL 进展,主要在扩展生态:新增稳定 ABI abi3t,让适配过的 C 扩展更容易为自由线程构建提供跨版本安装包。普通版 Python 并没有因此默认去掉 GIL。除此之外,性能、asyncio 和默认文本编码也有不少变化,其中有些可能比 GIL 更早影响我们的日常脚本。
本文看点
01、无 GIL 能否直接用
02、性能数字怎么看
03、旧脚本升级要查什么
01、无 GIL 现在能直接用吗?
常规安装的 CPython 3.15 仍有 GIL。同一时刻,只有一个线程执行 Python 字节码。多线程处理网络和文件 I/O 依旧有用;纯 Python 的 CPU 密集计算,不会因为升级就自动用满所有核心。
Python 从 3.13 起就提供自由线程构建。3.15 新增稳定 ABI abi3t,方便适配过的 C 扩展长期支持这类构建。普通开发者要试无 GIL 运行,仍需安装自由线程版本,再检查依赖包是否兼容。有些尚未适配的扩展被导入后,还可能让 GIL 重新启用。
如果手里的工作主要是巡检、调用云 API 和处理日志,目前没必要为了 GIL 专门迁移。确实要让多线程并行做 CPU 计算,再单独测试自由线程版本的收益和内存开销。
02、升级到 3.15,能快多少?
官方给出了几组性能数据,其中最醒目的是实验性 JIT。在特定的 Linux 基准测试中,启用 JIT 的构建比标准解释器快约 7% 到 8%。不同测试项目差异很大,有的甚至变慢。JIT 仍处于实验阶段,把现有程序升级到 3.15,并不能直接套用这个数字。
Windows 官方 64 位安装包也换用了新的解释器实现。官方在特定硬件和编译环境下测得约 15% 到 20% 的基准性能提升。对经常等接口、数据库和远端主机响应的运维脚本来说,解释器快了,任务总耗时也未必明显缩短。
我更想试的是显式延迟导入。3.15 可以写 lazy import 模块名,等第一次使用该模块时再加载。一个命令行工具若依赖不少模块、每次只执行其中一小部分功能,启动时间可能因此缩短。普通 import 的行为没有改变。改用 lazy 后,缺少依赖等错误也会推迟到第一次使用时出现,先挑启动慢的工具试就够了。
03、asyncio 有个顺手的新方法
asyncio.TaskGroup 新增了 cancel()。比如并发查询几个服务,只要拿到一个可用结果,就可以取消组内还没完成的任务。过去要提前结束整个任务组,往往得借助一个专门抛异常的任务;现在可以直接调用 TaskGroup.cancel()。
任务收到取消请求后,连接和临时资源仍要正常清理。写过异步巡检的人知道,取消动作本身简单,后续清理没处理好才容易出问题。
另一个变化要留给升级检查。asyncio 的事件循环 policy 系统已弃用,计划在 3.16 移除。如果项目用过 set_event_loop_policy(),可以逐步迁移到 asyncio.run() 或 asyncio.Runner 的 loop_factory。
04、默认编码变了,旧脚本要留意
3.15 在没有指定 encoding 时,文本读写默认使用 UTF-8。Linux、Windows 和容器之间的行为会更一致,不过原来依赖本地编码的旧文件,也可能因此读失败。
跨版本运行的脚本仍建议明确写 encoding="utf-8"。如果必须按系统编码读取,就用 encoding="locale"。升级前可以运行 python -X warn_default_encoding 脚本.py,找出依赖默认编码的地方。
语言层面还有 frozendict 和 sentinel。前者让映射的顶层键值关系保持不变,后者可以清楚地区分“没有传参数”和“明确传了 None”。推导式里的解包写法也更灵活。这些改动有用,现有脚本却无须为此大面积重写。
新加入的采样分析器 profiling.sampling 可以附加到运行中的 Python 进程,帮助定位时间花在哪些函数上。系统分析工具也更容易读取 3.15 的调用栈。日常开发先知道有这些工具,遇到性能问题时再按需使用即可。
05、升级前注意
先查默认编码,尤其是 Windows 上读写历史文件的任务。再看日期解析代码,datetime.strptime() 的格式如果包含日却没有年份,3.15 会抛出 ValueError。
还有一个容易漏的地方。sqlite3.connect() 除数据库路径外的参数,现在必须用关键字传入。写过小型资产库、缓存库或巡检结果库的人,可以搜一下旧代码。
依赖包也要重新安装和验证,特别是带 C 扩展的库。我会先用独立虚拟环境或容器跑 3.15,把测试、定时任务和一份真实数据走通,再考虑切换现有服务。操作系统自带的 Python 不适合直接替换。
对多数运维开发工作,3.15 可以开始试,升级收益得看具体任务。命令行工具可能从延迟导入中获益;主要耗时在网络等待的脚本,则更应该先确认接口和并发处理方式。GIL 和 JIT 也一样,先测自己的程序,再谈快了多少。
以上就是“Python 3.15 正式发布,GIL 这次去掉了吗?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14585/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料