我有一个代码,包含许多循环迭代,其中open file
和close file
语句的位置如下:
主循环
做好工作
打开文件
写入文件
关闭文件
继续工作
结束循环
但是,另一种选择是:
打开文件
主循环
做好工作
写入文件,[flush]
继续工作
结束循环
关闭文件
定位包含许多循环迭代的open file
和close file
语句是否有“最佳做法”?每个都有优点/缺点吗?我会看到性能差异吗?内存限制?未来的发展问题是什么?
我主要使用Fortran编码(因此标记),但是,我想知道这是否依赖于语言,因为我也使用其他语言编程。非常感谢任何帮助。
答案 0 :(得分:3)
如果您可以在循环外执行任务,则最好这样做,因为每次将其添加到循环队列都会导致性能下降(n次而不是1次)。因此,在循环之前声明变量或打开文件比在每次迭代时重复它更好。
总计: n *(k + q + r + s + l)
总计: 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
答案 1 :(得分:2)
像往常一样,您应该分析您的特定代码以查看瓶颈。但是,通常,打开和关闭文件非常昂贵。
请考虑以下事项:
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
因此,开启和关闭非常昂贵。
常数打开和关闭有哪些优势(或至少是减轻因素)?
较少打开的文件描述符。
关闭文件时,数据会刷新到该文件。当然你可以打电话给flush
,但这本身就是一项昂贵的操作,时间差会缩小。
如果您没有关键数据(例如,如果程序崩溃,您可以重新运行该程序),并且没有太多打开文件描述符问题 - 很少打开和关闭可能会更快。
答案 2 :(得分:0)
多次执行任务(在循环中)与仅执行一次(在循环之外)显然会更加昂贵 - 无论使用何种语言。