Python 3.15 引入懒加载功能,大幅提升命令行应用速度

Python 3.15a7 introduces lazy imports, as proposed in PEP 810, available with a simple uv python install 3.15 on major platforms. This feature aims to enhance the speed of CLI applications and large codebases with numerous unused imports. Implementation requires effort from libraries, and a new helper tool simplifies the process. Additionally, the post discusses the developer's experience using AI in creating this tool. For faster code, use the command uvx flake8-lazy --apply=list with Python 3.15. #### 内容简介 文章介绍了 Python 3.15(PEP 810)引入的 lazy import(惰性导入)特性:使用 lazy import 语法或在模块中声明 __lazy_modules__ 列表,可以让导入在首次实际使用时才发生,从而显著提升命令行工具和包含大量偶发依赖的程序的启动速度。文中通过 argparse + numpy 的示例说明了 --help 等场景中不必要导入带来的开销,给出了新的 lazy import 语法及向后兼容的做法,并提到现有工具链(如 uv 的安装/预编译行为和 Ruff 的兼容性更新)。作者还开发了一个辅助工具 flake8-lazy 来自动化迁移(TL;DR: 运行 uvx flake8-lazy --apply=list),并说明这是作者首次在开发该库时大量使用 AI,因此文章后半部分讨论了使用 AI 的开发体验。原文末尾有未完句子,但主要论点与示例和工具链兼容性已说明清楚。 #### 社区观点 有用户指出某些常见模式(例如 try: import numpy except ModuleNotFoundError: ...)无法用惰性导入实现,这让想延迟加载但又要在导入时检查依赖存在性的库感到为难;有人担心如果依赖不存在程序会直接崩溃,认为直接抛 ImportError 并不是处理可选依赖的好方法;还有人直接发问“处理可选依赖的正确方式是什么?”,表明社区对最佳实践存在疑问;一部分人认为对命令行工具来说这是非常有价值的优化,能显著缩短显示 --help 等路径的延迟;也有人对“禁用惰性导入同时禁用语法关键字”这一实现细节表示担忧,认为禁用惰性但保留语义以便于 lint 和测试是必要的,并提醒循环导入问题通常反映代码结构问题;还有用户以 SciPy 为例指出大型库占用内存大,惰性导入能带来明显好处,否则只能通过拆分或 vendor 小工具来规避;总体上社区对性能收益持肯定态度,但对与可选依赖、错误处理、循环导入和工具链兼容性的细节存在争论和谨慎态度。 #### 内容导读 理解本文的关键在于把握三点:第一,Python 3.15 的惰性导入能把“导入时执行”的成本推迟到首次使用时,从而改善 CLI 启动时间和那些包含大量不总被用到依赖的代码路径的性能;第二,使用方式有两种:新的语法形式 lazy import 模块名(在支持的解释器上惰性生效)和向后兼容的 __lazy_modules__ 列表(在旧解释器上只是普通导入),文中并举例说明何时不会触发导入(例如仅请求 --help);第三,迁移与实践上的注意事项:惰性导入并非万无一失——像在导入时检查依赖存在、try/except import 的模式、以及某些循环导入或语义依赖场景可能不兼容或需要额外处理;同时需要更新 lint/测试配置并在多 Python 版本上验证。作者提供了 flake8-lazy 辅助工具以自动化改造(示例命令 uvx flake8-lazy --apply=list),并分享了在实现过程中用 AI 辅助开发的经验。简而言之:如果你维护命令行应用或大型库且关心冷启动成本,惰性导入是值得尝试的优化,但在迁移前要评估可选依赖处理、循环导入风险、测试与 lint 的配置,并在真实环境中充分验证。

评论