【问题标题】:python write text to file slower than printing text to terminal with python?python将文本写入文件比使用python将文本打印到终端慢?
【发布时间】:2014-09-16 16:27:31
【问题描述】:

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

场景 1

将输出发送到标准输出大约需要 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'

【问题讨论】:

标签: python


【解决方案1】:

您正在为每次写入重新打开文件,尽量不要这样做:

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次,然后结束。

每次的工作量都很小,但是当你把它们都做这么多次时,它就会加起来。

【讨论】:

  • 哇..这看起来很简单,一直想知道我的程序有什么问题,有点笨重..你能解释一下为什么我们需要分配 open('myfile', 'w') 到一个变量,它实际上在做什么? ..您的回答非常感谢!
【解决方案2】:

与之前的答案相同,但有上下文!

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多