产品Simon Willison·原文 2026年10月13日

Python 3.15发布:支持显式惰性导入,Python 3.10正式停止支持

Simon Willison介绍了Python 3.15的新特性,包括PEP 810显式惰性导入、推导式解包和标准库采样分析器Tachyon;同时Python 3.10已不再受支持,他将在自己的开源项目中使用 3.11 的特性。

AI解读:Python 3.15发布,官方What's New指南由 3.14 和 3.15 发布经理Hugo van Kemenade整理。

Simon Willison最关注PEP 810显式惰性导入,用「lazy import json」「lazy from pathlib import Path」让模块在符号首次使用时才导入,直接针对插件重型依赖拖慢命令启动的问题。

PEP 798引入推导式解包语法,如「[*L for L in lists]」等价于嵌套循环展开。

标准库新增采样分析器Tachyon(profiling.sampling),原有tracing分析器从cProfile更名为profiling.tracing;可附加到运行中的进程,输出报告、火焰图、热图或Firefox profiler格式。

Miguel Grinberg对 3.15.0rc3的测试显示,3.15 性能与 3.14 大体相同,仅实验性JIT在Fibonacci测试中带来 1.2 倍提升。

Python 3.10已停止支持,Willison计划在项目中启用 3.11 特性,如tomllib、TaskGroup、datetime.UTC及SQLite的setlimit()、create_window_function()、blobopen() 等。

Python 3.15正式发布,官方What's New指南由 3.14 和 3.15 发布经理Hugo van Kemenade整理。Simon Willison在博客中介绍了自己关注的几个特性,并说明Python 3.10已停止支持,他将在维护的开源项目中开始使用 3.11 的特性。

显式惰性导入:PEP 810

Willison最关注的是PEP 810的显式惰性导入。写法为「lazy import json」和「lazy from pathlib import Path」,模块会在后续代码首次使用对应符号时才真正导入。

他解释这一特性针对的启动开销问题:他的LLM CLI工具支持插件,而插件若依赖sentence_transformers等重型库,可能让每次调用llm命令多出数秒。此前他只能在插件作者文档中建议手动做惰性导入。

推导式解包与标准库采样分析器

新语法「[*sublist for sublist in lists]」允许在推导式中解包。文档示例显示,对 [[1,2],[3,4],[5]] 执行「[*L for L in lists]」得到 [1,2,3,4,5],等价于嵌套的for循环;集合同样用「{*s for s in sets}」,字典用「{**d for d in dicts}」。该提案编号PEP 798,由Adam Hartz和Erik Demaine提出,是 2015 年随Python 3.5落地的PEP 448解包语法的扩展。

标准库新增采样分析器Tachyon,模块路径为profiling.sampling;原有tracing分析器从cProfile更名为profiling.tracing。采样分析器周期性抓取运行进程的栈轨迹,据此统计各函数耗时,开销较低,不需要事先对系统插桩。以前这类功能要靠py-spy等外部工具。

用法上,如果已有Python 3.15进程的PID,可以运行「python -m profiling.sampling attach 1234」开始采样;Willison说他在macOS上需要用sudo。与主程序交互一段时间后按Ctrl+C停止并查看报告。该工具还能输出火焰图、热图,以及可在Firefox profiler界面中查看的格式。

性能与 3.11 特性

性能方面,Willison引用Miguel Grinberg针对 3.15.0rc3的测试:3.15 与 3.14 大体相同,例外是实验性JIT,在Fibonacci测试中相对标准 3.15 解释器带来 1.2 倍提升。Willison称这是Miguel第一次观察到JIT有意义的性能提升;Miguel去年对 3.14 的测试则在更多类别上相对 3.13 有显著提升。

Willison还给出了用uv升级到 3.15 的命令序列:先「uv self update」更新uv自身,再「uv python install 3.15」安装稳定版,然后「uv python pin --global 3.15」把默认版本固定为 3.15(除非项目本身固定了其他版本);「uv run python --version」可确认版本。已用「uv tool install」安装的工具可用「uv tool upgrade datasette --python 3.15」重装到 3.15。

Willison说既然 3.10 已停止支持,他可以放弃 3.10 并开始使用 3.11 的特性:tomllib终于可依赖;asyncio新增TaskGroup和timeout();datetime.UTC成为datetime.timezone.utc的别名;SQLite支持获得多项升级,包括setlimit()/getlimit()、用于创建自定义窗口函数的create_window_function()、用于大BLOB值部分读写的blobopen(),以及可以用set_authorizer(None) 移除授权器——Datasette此前为这一点做了变通,他计划在未来几周把 3.11 改进落地到项目中,并已提交第一个移除该变通的Datasette PR。他还把click-app、datasette-plugin、python-lib和llm-plugin的cookiecutter模板更新为针对Python 3.11到 3.15 测试。

信息来源

Simon Willison原始来源