为什么Python中打开关闭文件比加载模块的执行速度更慢?
为什么打开并关闭文件比加载模块(模块本身也需要读取、加载对应的文件)速度更慢?
初始测试结果
打开并关闭文件测试
测试命令如下:
$ python timeit 'open("test.tmp", "r").close()' 50000 loops, best of 5: 5.36 usec per loop
单次执行耗时约5.36微秒。
导入模块测试
初始测试命令如下:
$ python timeit 'import requests; requests.get' 5000000 loops, best of 5: 98.3 nsec per loop
单次执行耗时仅98.3纳秒,远低于打开关闭文件的耗时。
原因说明
出现这个反直觉结果的核心原因是Python的模块缓存机制:Python首次导入模块后,会将模块对象缓存到sys.modules字典中,后续重复执行import语句时,不会重新读取磁盘上的模块文件、也不会重新执行模块初始化逻辑,只会直接返回缓存好的模块对象,因此速度极快。
强制重新导入的对照测试
如果每次导入后手动清除缓存,强制Python每次都重新加载模块,测试结果如下:
$ python -m timeit 'import requests; import sys; del sys.modules["requests"]' 2000 loops, best of 5: 211 usec per loop
此时单次执行耗时约211微秒,远高于打开关闭单个文件的耗时,符合「加载模块需要读取并解析整个模块文件,成本比只打开关闭单个文件更高」的预期。
内容的提问来源于stack exchange,提问作者Marco Aguiar
相关产品推荐
相关产品推荐

