编程学习网 > 编程语言 > Python > Python 3.15 发布了,聊聊几个比较实用的更新?
2026
10-16

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


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]
def process(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 方便多了。

# 以前只能整体控制,一损俱损
async with asyncio.TaskGroup() as tg:
    tg.create_task(fetch_url_1())
    tg.create_task(fetch_url_2()) 
# 现在可以给单个任务设 timeout
async with 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 3.15 发布了,聊聊几个比较实用的更新?”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。 

扫码二维码 获取免费视频学习资料

Python编程学习

查 看2022高级编程视频教程免费获取