Python3中的模块缓存:sys.modules是否依赖.pyc文件?
Python模块导入缓存与.pyc文件的关系
这俩是完全互不相关的两个独立机制,各自解决不同的问题:
sys.modules是Python的模块实例缓存:不管你是从.py源码还是.pyc字节码加载的模块,只要首次导入成功,模块对象就会被存在这个字典里。后续再导入同名模块时,直接从字典里取现成的模块实例,避免重复执行模块里的代码、重复做加载解析的工作——核心是缓存「已经加载好的模块对象」。.pyc文件是字节码缓存:Python会把源码编译成字节码,首次导入时如果允许生成(默认开启),就把字节码存成.pyc文件。下次导入时,如果.pyc的修改时间比.py新,就直接加载字节码跳过编译步骤——核心是缓存「编译后的字节码」。
举两个例子就能看清楚独立性:
- 用
python -B参数启动程序(禁止生成.pyc),sys.modules的缓存机制照样正常工作:第一次导入加载源码,后续导入直接从字典取实例。 - 手动删除
sys.modules里的某个模块条目(比如del sys.modules['math']),下次导入该模块时,依然会优先找对应的.pyc文件(如果存在且有效),重新加载字节码(或编译源码),然后再把新的模块实例存入sys.modules。
内容的提问来源于stack exchange,提问作者user9949858
相关产品推荐
相关产品推荐

