Python 频繁地对文件对象调用write()并添加少量内容是否不好?
我正在重构一个可怕的python脚本,它是生成lua绑定的polycode项目的一部分 我正在考虑将lua行写出来,因为它们是以块的形式生成的 但我的一般问题是,快速写入文件有哪些不利因素/注意事项? 例如:Python 频繁地对文件对象调用write()并添加少量内容是否不好?,python,performance,file,file-io,stress-testing,Python,Performance,File,File Io,Stress Testing,我正在重构一个可怕的python脚本,它是生成lua绑定的polycode项目的一部分 我正在考虑将lua行写出来,因为它们是以块的形式生成的 但我的一般问题是,快速写入文件有哪些不利因素/注意事项? 例如: persistent_file = open('/tmp/demo.txt') for i in range(1000000): persistent_file.write(str(i)*80 + '\n') for i in range(2000): persist
persistent_file = open('/tmp/demo.txt')
for i in range(1000000):
persistent_file.write(str(i)*80 + '\n')
for i in range(2000):
persistent_file.write(str(i)*20 + '\n')
for i in range(1000000):
persistent_file.write(str(i)*100 + '\n')
persistent_file.close()
这只是一种简单的方法,基本上可以尽可能快地大量写入文件。
我真的不希望在这样做时遇到任何实际问题,但我确实希望得到通知,缓存一次大的写入是否有好处?来自
open
函数的文档:
打开(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)->file对象
缓冲是用于设置缓冲策略的可选整数。
传递0以关闭缓冲(仅在二进制模式下允许),传递1以选择
行缓冲(仅在文本模式下可用),以及一个大于1的整数表示
固定大小的区块缓冲区的大小。当没有缓冲参数时
在给定的情况下,默认缓冲策略的工作方式如下:
- 二进制文件缓冲在固定大小的块中;缓冲区的大小
使用启发式选择,试图确定底层设备的
“块大小”并返回到
。 在许多系统上,缓冲区的长度通常为4096或8192字节io。默认缓冲区大小
- “交互式”文本文件(isatty()返回True的文件) 使用行缓冲。其他文本文件使用上述策略 对于二进制文件
换言之,在大多数情况下,频繁调用
write()
所产生的唯一开销是函数调用的开销。为什么会出现问题write()
只是将数据发送到内存中的文件处理程序,并在系统确定的某些点(除非调用flush()
)将数据写入磁盘。在调用close()
之前可能不会发生这种情况,这一切都是在幕后完成的。@MattDMo谢谢!我完全知道必须要有这样一种机制,但我忘记了:一种为我方便而自动地进行这种缓存的机制。小型读取也是如此。系统将对文件进行预读,并将数据缓存在内存中,这样就不会对小的读写操作造成惩罚……另一方面,您也可以写几行并对其进行分析;-)