page contents

懒导入终于来了!Python 3.15 新功能速览

Python 3.15 还没正式落地之前,社区里已经有一个功能被不少开发者盯上了:懒导入(Lazy Imports)。

attachments-2026-11-SRTpQOg06af11df9c9d2b.png

Python 3.15 还没正式落地之前,社区里已经有一个功能被不少开发者盯上了:懒导入(Lazy Imports)。

为什么大家这么关注?

因为 Python 项目一大,启动慢这个问题基本躲不开。

我自己维护过一些内部工具,代码量上来以后,启动一次命令行程序,经常不是业务逻辑慢,而是卡在一堆 import 上。

启动时加载数据库驱动、日志组件、云 SDK、科学计算库……

真正执行的代码可能就两三行,但 Python 先把几十个模块全部加载一遍。

比如这种代码:

import pandas as pd
import numpy as np
import requests
import sqlalchemy
import boto3

def run():
    print("开始处理任务")

if __name__ == "__main__":
    run()

看着没问题。

但如果这是一个 CLI 工具,你只是执行一个简单参数检查:

python tool.py --help

结果也要等一堆第三方库初始化。

很多时候,程序慢的不是“执行慢”,而是“进门前准备太多”。

Python 3.15 这次引入的懒导入,就是针对这个问题来的。

简单理解:

以前:

import xxx

执行到这里,Python 马上加载模块。

现在:

import xxx

可以先记录一下:

“这个模块有人要用。”

真正访问里面对象的时候,再加载。

这和数据库里的懒加载有点像。

比如 ORM 里的关联对象:

user.orders

如果没访问 orders,不查数据库。

懒导入也是类似逻辑:

不用模块,就先别加载。

我平时排查 Python 启动慢,第一个习惯不是看代码,而是看 import 时间。

以前经常用这个:

python -X importtime app.py

输出类似:

import time:
import pandas   1.823s
import numpy    0.932s
import boto3    0.721s

一眼能看到谁拖慢启动。

很多项目最后优化半天,发现业务代码没问题,就是依赖太重。

比如一个后台管理脚本:

import openpyxl
import matplotlib
import torch
import fastapi

结果只是导出一个 Excel。

torch 和 matplotlib 根本没用。

但是 Python 不知道,它看到 import 就加载。

Python 3.15 的懒导入解决的就是这种情况。

假设:

import heavy_module

print("hello")

开启懒导入后,Python 不会马上执行 heavy_module 里面的初始化代码。

只有:

heavy_module.start()

真正访问时,才触发加载。

对于大型项目,收益比较明显。

尤其这些场景:

命令行工具

大型 Web 服务

AI 工程项目

数据分析工具

插件系统

这些项目都有一个共同特点:

依赖很多,但一次运行只使用其中一部分。

不过这里有个坑。

懒导入不是打开以后所有问题都解决。

老项目里面,经常有人这么写代码:

# config.py

import os

TOKEN = os.getenv("TOKEN")

print("配置初始化完成")

然后其他地方:

import config

依赖 import 过程执行初始化。

这种代码以前能跑,是因为 import 本身带副作用。

懒导入以后:

如果没人真正访问 config 里的内容,初始化可能不会发生。

类似这种:

import logger

logger.init()

如果 logger 设计得不好,就可能出现顺序问题。

所以懒导入更适合模块职责清晰的项目。

不要把初始化逻辑塞进 import。

Python 3.15 还有一个方向值得关注,就是解释器启动优化。

Python 这些年一直在解决一个问题:

“动态语言为什么启动慢?”

因为 Python import 系统非常灵活。

它允许:

动态加载模块

修改 sys.path

自定义 importer

import hook

灵活的代价就是启动成本。

所以 Python 团队一直在优化解释器层。

比如以前很多项目会自己做:

延迟 import:

def export_excel(data):
    import openpyxl

    workbook = openpyxl.Workbook()
    return workbook

把重量级依赖放函数里面。

这其实就是手动懒加载。

Python 3.15 做的是把这个能力往解释器层推进。

不过实际开发里面,我觉得不要一上来就全部开启。

尤其生产服务。

比如一个 Web 服务:

from fastapi import FastAPI
from database import engine
from cache import redis_client

app = FastAPI()

这里数据库连接、缓存初始化,本身就是启动阶段需要验证的。

如果全部懒加载:

服务启动成功了。

但是第一次请求进来:

数据库连接失败。

用户直接收到 500。

这种问题排查起来反而更麻烦。

我的习惯是:

启动必须检查的东西,提前加载。

可选能力,延迟加载。

比如:

def generate_report(data):
    from report_service import build_pdf

    return build_pdf(data)

报表功能不是每次请求都有,就没必要启动时加载。

另外一个变化,是 Python 3.15 对开发体验也会继续优化。

比如类型提示、解释器错误信息、性能分析工具这些方向。

现在 Python 项目越来越大型化,已经不是以前写几个脚本那么简单。

很多公司 Python 服务:

几十万行代码。

几百个依赖。

启动速度、内存占用、模块管理都会影响线上体验。

懒导入看起来只是一个小功能,但它解决的是 Python 大型化之后遇到的真实问题。

最后说一句我的看法。

Python 早期最大的优势是开发快。

但是项目规模起来以后,问题也很明显:

启动慢。

内存高。

依赖重。

模块管理混乱。

所以这几年 Python 的优化方向其实很明确:

解释器更快。

启动更快。

大型项目更容易维护。

懒导入就是其中一步。

对于写小脚本的人,可能感觉不明显。

但对于维护几年历史代码的团队来说,这种优化,往往比增加一个语法糖更有价值。

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

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

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2564 篇文章

作家榜 »

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