如何将Python包常驻内存以减少pywsd.utils重复预热耗时
方案1:同进程调用(优先推荐,零额外代码改造成本)
Python自带模块缓存机制:同一个进程内,任意模块第一次被import后,会自动存入sys.modules字典,后续所有对该模块的导入请求都会直接返回缓存的实例,不会重复执行模块顶层代码,也就是说PyWSD的预热逻辑只会执行一次。
该方案完全匹配你的需求:
- 不需要将test.py导入main.py
- 不需要迁移任何mainfile.py中的代码
- 只需要确保main.py调用mainfile.py的逻辑在同一个进程内执行,不要用
subprocess/os.system这类新开进程的方式调用即可
你可以在test.py顶层加一行打印验证效果:
print("test.py 顶层代码执行,PyWSD开始预热") from pywsd.utils import lemmatize_sentence def test_fun(): print("Hello")
同一进程内这行打印只会出现一次,证明预热仅执行一次。
方案2:跨进程调用场景适配(必须开新进程跑mainfile.py时使用)
如果你的业务逻辑强制要求每次调用mainfile.py都开新进程,可以选以下两种实现:
- 本地常驻服务:用FastAPI/Flask写一个几十行代码的轻量本地HTTP服务,服务启动时预热一次PyWSD,暴露一个调用
test_fun的接口,所有mainfile.py进程直接调用本地接口获取结果,无需重复预热 - 共享内存缓存:用
multiprocessing.Manager或joblib将预热后的PyWSD模型对象序列化存入共享内存,每次mainfile.py启动后直接从共享内存加载,耗时可压缩到毫秒级
方案3:懒加载兜底优化
如果以上两种方案都不适用,可以修改test.py把PyWSD的导入延迟到第一次调用函数时执行,避免导入未使用的test.py时浪费预热时间:
# test.py 修改后代码 _lemmatize_sentence = None def test_fun(): global _lemmatize_sentence if _lemmatize_sentence is None: # 仅第一次调用时执行导入预热 from pywsd.utils import lemmatize_sentence _lemmatize_sentence = lemmatize_sentence print("Hello") # 后续业务逻辑使用_lemmatize_sentence变量即可
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

