用途:让 ML 模型、拼写检查词典、嵌入式数据库、大型第三方导入等昂贵资源,不出现在从不使用它们的代码路径上。核心观点是:成本通常在构造而非调用,若廉价函数与昂贵资源共享构造函数、工厂或导入,剖析函数体往往查不到问题。
主要做法:把只在首次真正使用时才构造的字段改为惰性属性并缓存到实例(如显式 property 检查后赋值);注意 functools.cached_property 在 3.12 起首次调用无锁、并发首次访问可能计算两次,其删除/预填重置方式易出错,需要受控加锁或安全重置时用显式形式。仅在构造无调用方依赖顺序的副作用(如打开文件、绑定端口、注册信号处理器)时才能延迟,否则应改成方法。避免一个工厂构建全部分析器,让廉价入口点各自持有访问器或让模型成为惰性句柄持有者,并明确哪些辅助函数是纯的、哪些真正需要初始化模型。不要每次调用都加载再卸载,应把句柄缓存到进程生命周期;进程级缓存会使缓存对象内部的昂贵构造变成永久成本,因此内部也必须惰性。
测量与测试:在冷进程、首次调用、逐个入口点计时;用 python -X importtime -c "import mypkg.api" 区分一次性导入与每次加载;用 tracemalloc 测保留大小。测试中 ambient fixture 可能已预载真实模型,应断言加载器未被调用(如 monkeypatch 将 load_language_model 替换为会 AssertionError 的 mock,再 loader.assert_not_called())。注意字段变惰性会改变 patch 绑定时机:原先在 setup_method 中已绑定实例的测试可能直到此时才真正生效,需逐个重读原本 patch 延迟构造函数的测试。可用 manager._model = Mock() 直接填私有槽位以在测试中绕过加载。资料未提供该技能的安装命令、平台或收费信息。