Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 频繁地对文件对象调用write()并添加少量内容是否不好?_Python_Performance_File_File Io_Stress Testing - Fatal编程技术网

Python 频繁地对文件对象调用write()并添加少量内容是否不好?

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

我正在重构一个可怕的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):
    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的整数表示 固定大小的区块缓冲区的大小。当没有缓冲参数时 在给定的情况下,默认缓冲策略的工作方式如下:

  • 二进制文件缓冲在固定大小的块中;缓冲区的大小 使用启发式选择,试图确定底层设备的 “块大小”并返回到
    io。默认缓冲区大小
    。 在许多系统上,缓冲区的长度通常为4096或8192字节

  • “交互式”文本文件(isatty()返回True的文件) 使用行缓冲。其他文本文件使用上述策略 对于二进制文件


换言之,在大多数情况下,频繁调用
write()
所产生的唯一开销是函数调用的开销。

为什么会出现问题
write()
只是将数据发送到内存中的文件处理程序,并在系统确定的某些点(除非调用
flush()
)将数据写入磁盘。在调用
close()
之前可能不会发生这种情况,这一切都是在幕后完成的。@MattDMo谢谢!我完全知道必须要有这样一种机制,但我忘记了:一种为我方便而自动地进行这种缓存的机制。小型读取也是如此。系统将对文件进行预读,并将数据缓存在内存中,这样就不会对小的读写操作造成惩罚……另一方面,您也可以写几行并对其进行分析;-)