为什么Python第二次读取二进制文件的速度远快于第一次?
为什么关闭文件后再次读取大二进制文件速度会暴增?
这是个非常典型的操作系统缓存优化现象,核心原因就是**操作系统的页缓存(Page Cache)**在背后起作用,我来给你拆解清楚:
第一次读取的本质:磁盘IO的耗时
当你第一次执行with open(fp, 'rb') as f: buffer = f.read()时,文件的内容还完全在硬盘(或其他慢存储介质)上。操作系统需要把1.02GB的数据从磁盘读取到内存中——这个过程是实打实的磁盘IO,速度完全受限于磁盘的读写性能(机械硬盘的连续读写速度大概在10-15MB/s左右,1GB文件读90秒完全符合这个速度)。
同时,操作系统会把刚读取的文件内容存入页缓存(一块专门用来缓存文件数据的内存区域),目的就是避免后续重复的磁盘IO操作。第二次读取的本质:内存缓存的复用
虽然你关闭了文件句柄,但操作系统并不会立刻清除页缓存里的文件数据——它会尽可能把最近访问过的文件内容留在内存里(只要内存还有空闲空间)。当你再次执行读取操作时,操作系统发现目标文件的内容已经在页缓存里了,就直接从内存把数据复制到你的Python程序的buffer变量中,这个过程是内存间的复制,速度能达到GB/s级别,所以0.5秒就能完成。补充几个关键细节:
- 这个缓存是操作系统层面的优化,和Python语言无关——哪怕你用C、Java或者命令行工具读同一个文件,都会出现同样的速度差异。
- 页缓存的管理完全由操作系统自动完成:如果系统内存不足,操作系统会优先清除最久没被访问的缓存数据,给其他程序腾出空间。
- 如果在两次读取之间,原文件被修改过,操作系统会自动识别到变化,重新从磁盘读取最新内容,不会复用旧的缓存数据。
内容的提问来源于stack exchange,提问作者pstatix
相关产品推荐
相关产品推荐

