我正在编写一个程序,它接受一个字符串并计算此字符串中所有可能的重复排列。我将展示我的代码的一些片段,如果有人能指出我如何在将数据发送到文件时提高速度,我将不胜感激。
将输出发送到stdout大约需要12秒才能写入531,441行(3mb)
import itertools
for word in itertools.product(abcdefghi,repeat = 6):
print(word)
然后我尝试将输出发送到文件而不是stdout,这大概花了大约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时将数据附加到文件中。
我使用网络上的程序来执行此操作,我发现程序在将数据打印到终端时花了相同的时间,同样的网络prgoram花了大约3秒钟将这些组合输出到文件,而我的程序花了5个分钟输出数据到文件!
我也试过运行我的程序并将输出重定向到bash终端中的文件,这需要相同的时间(3秒)!
'myprog' > 'output file'
答案 0 :(得分:4)
您正在为每次写入重新打开文件,请不要这样做:
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时间,然后完成。
每次工作量都很小,但是当你多次这样做时,就会增加。
答案 1 :(得分:0)
与之前的答案相同,但有上下文!
import itertools
with open('myfile', 'w') as output:
for word in itertools.product(abcdefghi, repeat=6):
output.write(word + '\n')
上下文具有自行清理和处理错误的好处。