直接用open()写文件慢,因每次write需经Python I/O层、编码转换及OS缓冲,小数据频繁写入开销大;改用io.BufferedWriter可自定义大缓冲(如1MB)、绕过编码开销,显著提升批量写入性能。

为什么直接用 open() 写文件慢
默认的 open('file.txt', 'w') 确实用了缓冲,但缓冲区大小由系统决定(通常 8KB),对大流量写入不够用。更关键的是:每次调用 f.write() 都会经过 Python I/O 层、编码转换(如 UTF-8)、再交到 OS 缓冲区——中间环节多,小数据频繁写入时开销明显。
用 io.BufferedWriter 手动控制缓冲更有效
它绕过部分高层封装,让你直接操作二进制流 + 自定义缓冲区,尤其适合已知数据是 bytes 或能预编码的场景。常见于日志聚合、二进制导出、高频写入等。
- 必须传入一个支持
write()的底层二进制流(如open(..., 'wb')返回的对象) - 缓冲区大小建议设为 1MB(
buffering=1024*1024),太小起不到作用,太大可能延迟落盘 - 不要混用
BufferedWriter和原始文件对象的write(),会破坏缓冲一致性 - 写完必须调用
.flush()或.close(),否则最后一批数据可能滞留在内存里
示例:
import io
<p>with open('output.bin', 'wb') as f_raw:
with io.BufferedWriter(f_raw, buffering=1024*1024) as f:
for i in range(100000):</p><h1>注意:必须是 bytes,不能是 str</h1><pre class="brush:php;toolbar:false;"> f.write(f'{i},'.encode('utf-8'))
f.flush() # 强制刷出剩余缓冲
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
立即学习“Python免费学习笔记(深入)”;
BufferedWriter 和 open(..., buffering=...) 选哪个
两者底层机制相似,但行为有实质差异:
-
open(..., buffering=N)仍走文本模式路径,会做换行符转换、编码/解码,适合写字符串 -
io.BufferedWriter是纯二进制流包装器,零编码开销,适合你已掌握编码逻辑或写 raw bytes - 如果写的是大量结构化文本(如 CSV 行),先用
'\n'.join(lines).encode()批量转 bytes 再交给BufferedWriter,比逐行f.write(line)快 2–5 倍 - Windows 下注意:文本模式自动把
\n转成\r\n,而BufferedWriter不转——若需兼容,得自己处理
容易被忽略的落盘时机问题
缓冲只是把数据攒在内存里,不等于写到磁盘。OS 层还有 Page Cache,Python 层的 flush() 只保证进内核缓冲区,不保证落盘。真要强持久化(比如防断电丢数据),得额外调用 os.fsync(f.fileno()) ——但这会让速度掉回接近无缓冲水平,慎用。
多数场景下,靠 BufferedWriter + 合理 flush() 频率(比如每 10MB 刷一次)就够了。真正卡住性能的,往往不是“没落盘”,而是“反复小写 + 频繁 flush”。

















