Python写入文件速度为何慢于在终端打印文本?

2 投票
2 回答
2510 浏览
提问于 2025-04-18 14:41

我正在写一个程序,这个程序可以从一个字符串中计算出所有可能的重复排列。我会展示一些代码片段,如果有人能告诉我怎么提高把数据写入文件的速度,我会非常感激。

场景 1

把输出发送到标准输出(stdout)大约花了12秒,写了531,441行(3MB)。

import itertools 
for word in itertools.product(abcdefghi,repeat = 6):
    print(word)

场景 2

然后我尝试把输出发送到一个文件,而不是标准输出,这大约花了5分钟。

import itertools
word_counter=0
for word in itertools.product(abcdefghi,repeat = 6): 
    word_counter=word_counter+1
    if word_counter==1:
        open('myfile', 'w').write(word)
    else:
        open('myfile', 'a').write(word)

word_counter 用来跟踪重复排列的数量,当 word_counter 为1时,程序会创建文件,之后当 word_counter 大于1时,就会把数据追加到这个文件里。

我在网上使用了一个程序来做这个,发现这个程序在打印数据到终端时花的时间和我一样,而这个网上的程序把这些组合输出到文件只花了大约3秒,而我的程序输出到文件却花了5分钟!

我还尝试在bash终端中运行我的程序并把输出重定向到文件,这样也只花了3秒!

'myprog' > 'output file'

2 个回答

1

和之前的回答一样,不过加了一些背景信息!

import itertools
with open('myfile', 'w') as output:
    for word in itertools.product(abcdefghi, repeat=6): 
        output.write(word + '\n')

背景信息的好处在于它们可以自己清理,不会留下垃圾,并且能够处理错误。

5

你每次写入的时候都重新打开文件,尽量避免这样做:

import itertools

output = open('myfile', 'w')
for word in itertools.product(abcdefghi, repeat=6): 
    output.write(word + '\n')

[编辑并解释] 当你处理53万个单词时,即使每个单词的处理速度稍微慢一点,累积起来也会让整个程序变得非常慢。

我的方法是先做一次准备工作(打开文件),把它放到内存里,然后处理50万个单词并保存,最后再做一次收尾工作(关闭文件)。这就是为什么文件会保存在一个变量里——这样你只需要设置一次,就可以反复使用。

而你的方法几乎没有做任何准备工作,接着你要把计数器加1 50万次,检查计数器的值50万次,分支判断50万次,每次都打开文件,还要让Windows(或Linux)每次都检查你的权限,把文件放到内存里50万次,写入50万次,最后停止使用你打开的文件(因为你没有保存),这样文件就会变成“垃圾”,被清理掉——这一切都要重复50万次,最后才结束。

每次的工作量虽然很小,但当你重复这么多次的时候,累积起来就会很大。

撰写回答