打开文件和关闭文件声明定位:最佳做法,优点,缺点

Open file and close file statement positioning: best practice, advantages, disadvantages

本文关键字:文件 最佳 优点 缺点 定位 声明      更新时间:2023-10-16

我有一个代码,包含许多循环迭代,open fileclose file语句定位如下:

    主循环在
    1. 工作

    2. 打开的文件

    3. 写入文件

    4. 关闭文件

    5. 继续工作

  • 结束循环

但是,另一种选择是:

  • 打开的文件

  • 主循环在
    1. 工作

    2. 写入文件,[flush]

    3. 继续工作

  • 结束循环

  • 关闭文件

是否有一个"最佳实践"定位open fileclose file语句包含许多循环迭代?每一种都有优点/缺点吗?我会看到性能差异吗?内存限制?未来的发展问题是什么?

我主要在Fortran(因此标签)编码,但是,我想知道这是否依赖于语言,因为我也用其他语言编程。如有任何帮助,不胜感激。

如果你可以在循环之外执行任务,你最好这样做,因为每次将它添加到循环队列都会导致性能下降(n次而不是1次)。因此,在循环之前声明变量或打开文件比每次迭代都重复要好。


  • 主循环
    1. do work - cost: k * n
    2. 打开文件- 成本: q * n
    3. 写入文件- cost: r * n
    4. 关闭文件- 成本: s * n
    5. 继续工作- 成本: l * n
  • 结束循环
总:

n * (k + q + r + s + l)


  • 打开文件- 成本: q
  • 主循环
    1. do work - cost: k * n
    2. 写入文件- cost: r * n
    3. 继续工作- 成本: l * n
  • 结束循环
  • 关闭文件- 成本: s
总:

n * (k + r + l) + q + s


sq是非常昂贵的,因为访问系统磁盘上的文件要花费更多的时间,并且与访问变量或执行计算相比非常慢,因为它需要从磁盘上获取数据,而不是存储在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的优点(或者至少是缓和因素)是什么?

  1. 当您关闭一个文件时,数据被刷新到该文件中。当然,你可以直接调用flush,但这本身就是一个昂贵的操作,而且时差会变小。

如果您没有关键数据(即,如果程序崩溃,您可以重新运行它),并且没有太多打开文件描述符问题-很少打开和关闭可能会更快。

无论使用何种语言,在循环内多次执行任务与在循环外只执行一次相比,显然成本更高。