实测 Python 3.15 lazy import:3.14 报 SyntaxError,3.15 里导入推迟到第一次使用;模块不存在时到使用处才报 ImportError 链;try、函数、类里不能写;-X lazy_imports=all 在 3.14 上被静默忽略;导入 15 个标准库模块的启动时间 3.15 普通 import 100.3 ms、lazy import 19.4 ms。
实测 Python 3.15 推导式里的 * 和 ** 解包:3.14 报 SyntaxError: iterable unpacking cannot be used in comprehension;3.15 里 [*a for a in xs] 等四种都能写;重复键后者覆盖;生成器表达式仍然惰性;各种写错的报错文本;字节码只有 LIST_EXTEND;拍平列表三种形状的速度对比。
实测 Python 3.15 内置 frozendict:3.14 里是 NameError;不是 dict 的子类但属于 Mapping;赋值删除是 TypeError、update/pop/clear 等方法不存在;可哈希、能传给 lru_cache、能当 dataclass 默认值;和 MappingProxyType 的区别;占内存、构造、读取、哈希的耗时对比。
实测 Python 3.15 的 profiling 包:cProfile 搬到 profiling.tracing,main/label/io/importlib 四个名字消失(cProfile.main() 是 AttributeError);新的采样分析器 python -m profiling.sampling 在 macOS 上 run/attach/dump 都报 Permission Error,需要 sudo;cProfile 输出在 3.14 与 3.15 上结构相同,.prof 文件能互读。
实测升级 Python 3.15 会撞上的移除项:No module named sre_compile/sre_constants/sre_parse;glob.glob0/glob1、platform.java_ver、typing.no_type_check_decorator、ctypes.SetPointerType 变成 AttributeError;pathlib.PathInfo 等四个名字搬走;typing.ByteString、tarfile.version 开始警告;以及怎么在 3.14 上用 -W 提前发现。
实测 Python 3.15 默认 UTF-8:GBK、ISO8859-1 环境下 open() 的默认编码 3.14 跟系统、3.15 一律 utf-8;3.14 写的 GBK 文件在 3.15 里 UnicodeDecodeError,反方向也读不了;GBK 环境下 print emoji 3.14 UnicodeEncodeError;read_text、configparser、subprocess 一起变;PYTHONUTF8=0 与 -X warn_default_encoding。
实测 Python 3.15 报错信息的变化:110 个常见出错小程序逐字比较,只有 6 个文字变了——AttributeError 的建议从 Did you mean: 'append'? 变成 Did you mean '.append' instead of '.appnd'?,% 格式化的 TypeError 重写;SyntaxError 31 个全部相同;10 个常见警告只多了 typing.ByteString;以及依赖报错文字的正则会怎样。
实测 Python 3.14.9 对 3.15.0 的性能:18 个测试独立做两遍,几何平均比值 1.01 和 1.03(整体持平);递归 fib 两遍都是 1.23(3.15 慢),json.dumps 两遍是 0.89 和 0.86(3.15 快);Homebrew 的两个包编译选项不一样:3.14.9 有 --with-tail-call-interp,3.15.0 没有。