python写文件到文件比用python打印文本到终端慢?

时间:2014-07-24 22:40:17

标签: python

我正在编写一个程序,它接受一个字符串并计算此字符串中所有可能的重复排列。我将展示我的代码的一些片段,如果有人能指出我如何在将数据发送到文件时提高速度,我将不胜感激。

场景1

将输出发送到stdout大约需要12秒才能写入531,441行(3mb)

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

场景2

然后我尝试将输出发送到文件而不是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'

2 个答案:

答案 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')

上下文具有自行清理和处理错误的好处。