page contents

Python 3.15 发布了,聊聊几个比较实用的更新

Python 3.15.0 发布了。如果你平时还在跑 3.11 或者 3.10,确实可以考虑看看新版本了。这几年 Python 核心团队的节奏很稳,基本都在解决大家平时抱怨最多的痛点:运行慢、类型提示难写、标准库不够用。

attachments-2026-10-7f4XV0aI6adabceebfd2a.png

Python 3.15.0 发布了。如果你平时还在跑 3.11 或者 3.10,确实可以考虑看看新版本了。这几年 Python 核心团队的节奏很稳,基本都在解决大家平时抱怨最多的痛点:运行慢、类型提示难写、标准库不够用。

这次我翻了一遍 Release Notes,挑了几个日常开发中真正能用得上的改动,整理了一下。没废话,直接看东西。

几个值得关注的改动

1. Free-Threaded(无 GIL)模式转正

3.13 刚上无 GIL 的时候还是实验特性,跑起来得加参数,而且容易出玄学 bug。到了 3.15,这个模式正式去掉了“实验”标签。

底层的 JIT 编译器也顺手优化了一波,官方给出的数据是比 3.14 快 8% 到 12% 左右。对于 CPU 密集型的多线程任务,现在不用非得绕道去写 multiprocessing 了。

# 以前跑无 GIL 得在命令行加 -X gil=0
# 现在可以直接在代码里判断当前环境
import sys

if sys._is_gil_enabled():
    print("GIL 还在")
else:
    print("多线程可以跑满多核了")

2. type 语句的泛型推断更好用了

之前定义带泛型的类型别名,得导一堆 TypeVar,写起来又长又啰嗦。3.15 把 type 语句的推断做得更聪明了,处理复杂泛型时不需要再手动堆砌那些冗余的类型变量。

对大型项目来说,这能让代码干净不少,IDE 补全也更准。

# 以前的写法,看着就累
from typing import TypeAlias, TypeVar, Dict

K = TypeVar('K')
V = TypeVar('V')
MyMap: TypeAlias = Dict[K, V]

# 现在的写法,一行搞定
type MyMap[K, V] = dict[K, V]

defprocess(data: MyMap[str, int]) -> None:
    pass

3. zstd 压缩算法进标准库了

做爬虫或者处理数据的同学应该懂这个含金量。Zstandard (zstd) 压缩率高、解压快,但以前想用得自己去 pip install zstandard。现在它直接进了标准库。

以后打包工具或者写网络传输层,少一个第三方依赖,部署的时候能省点心。

# 以前必须装第三方包
# import zstandard as zstd
# cctx = zstd.ZstdCompressor()

# 现在直接用标准库
import compression.zstd as zstd

data = b"hello python 3.15"
compressed = zstd.compress(data)
print(zstd.decompress(compressed))

4. asyncio.TaskGroup 支持单任务超时

TaskGroup 挺好用的,但以前有个坑:里面一个任务卡死了,整个组都得跟着等,或者一起被取消。3.15 给 create_task 加了细粒度的超时控制。

写并发请求的时候,谁超时就只取消谁,不会误伤其他正常的任务,查 bug 方便多了。

# 以前只能整体控制,一损俱损
asyncwith asyncio.TaskGroup() as tg:
    tg.create_task(fetch_url_1())
    tg.create_task(fetch_url_2()) 

# 现在可以给单个任务设 timeout
asyncwith asyncio.TaskGroup() as tg:
    tg.create_task(fetch_url_1(), timeout=5.0)
    tg.create_task(fetch_url_2(), timeout=2.0)

5. removeprefix 支持正则了

3.9 加的 removeprefix 和 removesuffix 很好用,可惜只能匹配死字符串。这次更新让它们能接收编译好的正则对象了。

洗脏数据或者处理路径前缀时,不用再硬凑 re.sub 了,语义上好读很多。

import re

text = "ID_12345_user_data"
pattern = re.compile(r"^ID_\d+_")

# 以前只能这么干
clean_text = re.sub(pattern, "", text) 

# 现在这样写更直观
clean_text = text.removeprefix(pattern)
print(clean_text) # user_data

6. warnings 模块加了快捷上下文

老项目里总有几个烦人的废弃警告,以前要临时屏蔽它们,得写好几行 catch_warnings 加上 simplefilter。现在多了一个更简短的用法,支持按规则过滤。

过渡期用来临时“闭嘴”挺方便的,不影响全局的警告配置。

import warnings

# 以前的写法
with warnings.catch_warnings():
    warnings.simplefilter("ignore", DeprecationWarning)
    old_api_call()

# 现在精简了
with warnings.ignore(DeprecationWarning, category_match="*urllib*"):
    old_api_call()

升级前注意几个坑

除了新东西,底层也扔了一些历史包袱,升版本前最好过一遍:

cgi 模块彻底删了。3.13 就说要废弃,这次真没了。如果代码里还有 cgi.escape,赶紧换成 html.escape,不然跑不起来。

内存占用降了一点。默认的 pymalloc 做了碎片整理,像 Django 或 FastAPI 这种常驻内存的服务,跑久了大概能省 5% 左右的内存。

typing.ByteString 准备下线了。计划 3.17 移除,用到的地方建议早点改成 collections.abc.Buffer。

要不要升?

老规矩:新项目随便上,老项目等小版本。

如果是自己写的脚本或者刚起的新微服务,直接用 3.15 没毛病,特别是 zstd 内置和 TaskGroup 的改进,能少写点样板代码。

如果是公司跑了很久的线上业务,建议等一等 3.15.1。顺便借这个机会,用工具扫一下项目里有没有用到 cgi 这类已经被删掉的旧模块。

Python 这几年的迭代确实务实,基本都是冲着解决实际工程问题去的。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

  • 发表于 2026-10-23 09:49
  • 阅读 ( 27 )
  • 分类:Python开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2545 篇文章

作家榜 »

  1. Pack 2545 文章
  2. 轩辕小不懂 2403 文章
  3. 小柒 2228 文章
  4. Nen 576 文章
  5. 王昭君 216 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章