打开文件和关闭文件声明定位:最佳做法,优点,缺点
Open file and close file statement positioning: best practice, advantages, disadvantages
我有一个代码,包含许多循环迭代,open file
和close file
语句定位如下:
- 主循环在
工作
打开的文件
写入文件
关闭文件
继续工作
结束循环
但是,另一种选择是:
-
打开的文件
主循环在 工作
写入文件,[flush]
继续工作
结束循环
关闭文件
是否有一个"最佳实践"定位open file
和close file
语句包含许多循环迭代?每一种都有优点/缺点吗?我会看到性能差异吗?内存限制?未来的发展问题是什么?
我主要在Fortran(因此标签)编码,但是,我想知道这是否依赖于语言,因为我也用其他语言编程。如有任何帮助,不胜感激。
如果你可以在循环之外执行任务,你最好这样做,因为每次将它添加到循环队列都会导致性能下降(n次而不是1次)。因此,在循环之前声明变量或打开文件比每次迭代都重复要好。
- 主循环
- do work - cost: k * n
- 打开文件- 成本: q * n
- 写入文件- cost: r * n
- 关闭文件- 成本: s * n
- 继续工作- 成本: l * n
- 结束循环
n * (k + q + r + s + l)
- 打开文件- 成本: q
- 主循环
- do work - cost: k * n
- 写入文件- cost: r * n
- 继续工作- 成本: l * n
- 结束循环
- 关闭文件- 成本: s
n * (k + r + l) + q + s
s
和q
是非常昂贵的,因为访问系统磁盘上的文件要花费更多的时间,并且与访问变量或执行计算相比非常慢,因为它需要从磁盘上获取数据,而不是存储在RAM中并且可以通过代码流轻松访问的变量。查看更多关于缓存和io缓冲的信息。
性能:
$ python -m timeit 'open("hw.txt").read()'
1000 loops, best of 3: 240 usec per loop
$ python -m timeit 'a=2;b=3;c=a**b'
100000 loops, best of 3: 2.15 usec per loop
像往常一样,您应该分析您的特定代码以查看瓶颈是什么。然而,一般来说,打开和关闭文件非常昂贵。
考虑以下内容:
def foo():
f = open('bar.txt', 'w')
for i in range(1000):
f.write('a')
f.close()
def bar():
for i in range(1000):
f = open('bar.txt', 'w')
f.write('a')
f.close()
让我们来计时:
>>> %timeit foo()
10000 loops, best of 3: 190 µs per loop
>>> %timeit bar()
10 loops, best of 3: 47.8 ms per loop
所以,打开和关闭是非常昂贵的。
常数open和close的优点(或者至少是缓和因素)是什么?
当您关闭一个文件时,数据被刷新到该文件中。当然,你可以直接调用
flush
,但这本身就是一个昂贵的操作,而且时差会变小。
如果您没有关键数据(即,如果程序崩溃,您可以重新运行它),并且没有太多打开文件描述符问题-很少打开和关闭可能会更快。
无论使用何种语言,在循环内多次执行任务与在循环外只执行一次相比,显然成本更高。
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 创建进行生产构建并创建调试信息的C++生成文件的最佳方法?
- 将位字符串转储到二进制文件的最佳方法是什么
- 比较文件中的最佳平均成绩并打印学生的姓名
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 为Catch2中的外部文本文件指定路径的最佳方式
- 检查特定目录中是否存在与文件匹配的 abc* 的最佳方法
- 复制文件的最佳方式是什么,以便我可以在复制过程中轻松取消复制?
- 获取 exe 文件夹路径的最佳方法?
- 从包含 IP 标头片段的二进制文件中读取结构的最佳方法是什么
- 避免遗漏包含相同文件的最佳方法是什么?
- 如何为多个文件处理选择最佳的I/O策略
- 比较两个文件中的两个中间人的最佳方法.C++
- 在Visual C ++中与Stockfish(外部可执行文件)通信的最佳方式
- 从CSV文件中提取每个条目字段的最佳方法是什么
- 计算文本文件中行数的最佳条件是什么
- 从.txt文件中汲取信息的最佳方法
- 在C 中将多个子类纳入文件中的最佳方法是什么?
- 读取四个数据文件并使用函数将它们放入结构数组的最佳方法是什么
- 头文件和cpp或只是cpp文件-最佳实践