我正在编写一个程序,它接受一个字符串并计算该字符串所有可能的重复排列。我将展示我的一些代码片段,如果有人能指出我如何提高将数据发送到文件时的速度,我将不胜感激。
场景一
将输出发送到标准输出大约需要 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'
最佳答案
您正在为每次写入重新打开文件,尽量不要这样做:
import itertools
output = open('myfile', 'w')
for word in itertools.product(abcdefghi, repeat=6):
output.write(word + '\n')
[编辑解释] 当您处理 530,000 个单词时,即使每个单词的速度稍微慢一点,整个程序也会慢很多。
我的方法是,你做一项设置工作(打开文件)并将其放入内存,然后浏览 500,000 个单词并保存它们,然后做一项整理工作(关闭文件)。这就是将文件保存在变量中的原因 - 因此您可以设置一次,然后一次又一次地使用它。
你的方式,你首先几乎不做任何设置工作,然后你将一个加到计数器 500,000 次,检查计数器的值 500,000 次,这样或那样分支 500,000 次,打开文件并强制 Windows(或 Linux ) 每次检查你的权限,将它放入内存 500,000 次,写入 500,000 次,停止使用你打开的文件(因为你没有保存它)所以它落入“垃圾”并被整理 - 500,000次,然后结束。
每次的工作量很小,但是当你做这么多次时,就会累加起来。
关于python 将文本写入文件比使用 python 将文本打印到终端慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945185/