Python不同CPU下包导入耗时测试:Pycharm首二次运行差异问询
耗时差异原因
你遇到的两次运行导入耗时差距大的问题,主要来自两层缓存:
- Python字节码缓存:首次导入模块时,Python会把
.py源码编译为字节码文件存储到对应目录的__pycache__文件夹下,后续导入直接读取预编译的字节码,跳过编译步骤。 - 操作系统文件页缓存:首次导入时需要从硬盘读取第三方库对应的源码、动态链接库(Linux下的
.so、Windows下的.pyd)等文件,操作系统会自动把读取过的文件暂存在内存的页缓存区,第二次运行时直接从内存读取文件,速度远快于硬盘读取。
注:你是两次启动独立的Python进程运行脚本,Python进程级的
sys.modules导入缓存不会跨进程生效,因此不是该差异的诱因。
解决方案
方案1:每次测试前清空系统页缓存(最准确,适合测真实冷启动耗时)
- Linux环境:每次运行测试脚本前,使用root权限执行命令即可清空全部文件页缓存,保证每次都是从硬盘读取文件:
sync && echo 3 > /proc/sys/vm/drop_caches - Windows环境:可以使用微软官方的
EmptyStandbyList工具执行缓存清空操作,也可以手动读写几个GB级的无关大文件把原有缓存挤掉,保证每次测试的硬盘读取条件一致。
方案2:统一测热启动耗时
如果你不需要测试冷启动的真实导入速度,只需要保证不同CPU的测试结果有对比性,可以统一取第二次及之后的热启动耗时,所有测试环境都遵循相同流程即可(比如每次测试前先运行一次脚本预热,再取第二次的运行结果)。
其他辅助优化配置
- 运行脚本时添加
-B参数,即python -B 测试脚本名.py,可以禁止Python生成.pyc字节码缓存;也可以提前删除所有相关库目录下的__pycache__文件夹,排除字节码缓存的干扰。 - 测试前关闭CPU睿频、节能模式,固定CPU运行频率,避免CPU频率波动导致的耗时误差。
- 如果是在同一个Python进程内多次测试导入,可以在每次导入后手动清理
sys.modules中的对应模块及子模块,示例逻辑如下:
注意该方法仅能模拟进程内的重复导入场景,和实际新进程启动导入的场景有差异,结果仅作参考。import sys # 导入torch后清理缓存 for mod_name in list(sys.modules.keys()): if mod_name == 'torch' or mod_name.startswith('torch.'): del sys.modules[mod_name]
内容的提问来源于stack exchange,提问作者Ai4l2s
相关产品推荐
相关产品推荐

