【问题标题】:Once opened and n-times written or n-times open but one time written per openning?一次打开,写 n 次,还是打开 n 次,每次打开写一次?
【发布时间】:2014-04-15 15:44:43
【问题描述】:


所以问题是 - 使用哪种情况?我得到了 url 列表并得到了一些神奇的函数 get_text_from_url - 我必须将它写入具有给定文件名的文件中 - 尽可能简单,但这两种情况中的哪种情况比另一种情况更好,为什么?
在这种情况下,优先级是时间和内存,而不是可读性(抱歉,Python)。
当然,欢迎任何其他版本。
第一:

def create_text(filename):        
    delete_current_text(filename)
    urllist = get_urls()
    for url in urllist:
        with open(filename, "a") as file:
             print >>file, get_text_from_url(url)


第二:

def create_text(filename):        
    urllist = get_urls()
    with open(filename, "w") as file:
         for url in urllist:
             print >>file, get_text_from_url(url)

【问题讨论】:

    标签: python file memory file-io time-complexity


    【解决方案1】:

    你的第二个例子会更好,因为对文件的打开/关闭操作有很大的开销,而后者只做了一次。

    但是,如果你存储结果应该会更好(如果 get_text_from_url 不会返回太大的内容),像这样:

    def create_text(filename):
        urllist = get_urls()
        result = map(get_text_from_url, urllist)
        with open(filename, "w") as file:
            file.write("\n".join(result))
    

    所以只有一次写入,并且只会在短时间内阻塞文件(假设 get_text_from_url 会进行网络请求,这比本地文件写入花费的时间要长得多)。

    【讨论】:

    • 抱歉,这是出于机器学习的目的,所以我无法对其进行映射。在我的情况下,它大约是 10 Mb,但可以将我的代码用于更大的大小,所以我想让这个代码在大的情况下工作。
    • 好的。所以如果内存使用是问题,我会说坚持第二个例子。
    【解决方案2】:

    如果您打开文件,执行写入操作,然后在完成后关闭它,I/O 会更快。实际上,您是在“打开一次,写入 n”和“打开 n,写入 n”(不是您所说的“打开 n,写入一次”)之间进行选择。使用后一种选项,您每次打开只执行一次写入,但您仍然总共执行 n 次写入。

    【讨论】:

    • 我已编辑问题名称。那么,如果我打开一次会更好吗?我只是想澄清一下。但是它将如何在内部工作 - 打开文件是否将某些内容存储在内存中,或者在使用“w”或“a”选项的 IO 中是否存在一些差异?我了解它们之间的区别,但是 IO 在时间和内存的含义上的工作方式是否不同?
    • @htzfun 通常我们假设内存使用比读/写文件等 I/O 成本便宜。但如果不是这种情况(比如要写入的数据太大),请考虑改为流式传输。
    • @htzfun 打开文件将导致您的程序在内存中保存一个文件描述符。不过,这是一个微不足道的内存量,在考虑时间/速度限制时,您不必担心它。确实,您提出的两种方法之间的内存成本根本没有太大区别。两者之间的主要区别在于 n-open 方法会慢得多,因为打开/关闭文件很慢。您可以轻松地测试这两种方法并比较它们的速度以亲自查看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    相关资源
    最近更新 更多