在Python中,read()或readlines()更快吗?

时间:2011-02-22 08:59:50

标签: python io

我想在我的代码中读取一个巨大的文件。 read()或readline()更快。循环怎么样:

for line in fileHandle

8 个答案:

答案 0 :(得分:22)

对于一个只用for循环遍历它的文本文件几乎总是可行的。没关系速度,它是最干净的。

在某些版本的python readline()中,只读取一行,而for循环读取大块并将它们分成行,这样可能会更快。我认为更新版本的Python也为readline()使用缓冲,因此性能差异将是微不足道的(for可能在显微镜下更快,因为它避免了方法调用)。然而,出于性能原因选择一个而不是另一个可能是过早的优化。

编辑添加:我刚刚查看了一些Python发行说明。 Python 2.5说:

  

混合迭代现在是非法的   带有for in line in file的文件   调用文件对象   read()/ readline()/ readlines()方法。

Python 2.6引入了TextIOBase,它同时支持迭代和readline()

Python 2.7修复交错read()readline()

答案 1 :(得分:15)

如果文件很大,read()肯定是个坏主意,因为它将整个文件加载到内存中(没有大小参数)。

Readline只读取一行,所以我认为对于大文件来说这是更好的选择。

只是迭代文件对象应该与使用readline一样有效。

有关详细信息,请参阅http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

答案 2 :(得分:7)

readlines的文档表明有一个可选的sizehint。因为它是如此模糊,很容易被忽视,但我发现这通常是读取文件的最快方式。使用readlines(1),它提示一行,但实际上读取大约4k或8k的行IIRC。这利用了OS缓冲,并且在不使用过多内存的情况下减少了调用次数。

您可以尝试使用不同大小的sizehint,但我在测试时发现1在我的平台上是最佳的

答案 3 :(得分:1)

如果你有足够的内存使用readline,如果性能是一个问题。我已经看到使用gzip文件时:read().split('\n')需要5秒才能循环,而使用迭代器需要38秒。 GZ文件的大小约为45 MB。

答案 4 :(得分:1)

read()基本上是尝试读取整个文件并将其保存到单个字符串中以供稍后使用,而readlines()也尝试读取整个文件但它会进行拆分(“\ n”)和将行的字符串存储到列表中。因此,如果文件大小过大,则不优选这两种方法。

readline()和for循环(即文件中的行:)将一次读取一行并将其存储到字符串中。如果内存允许,我猜他们会用同一时间完成这项工作。但是,如果文件大小很大,则首选这两个。

答案 5 :(得分:0)

如果你的文件是文本文件,那么使用readlines(),这显然是读取包含行的文件的方法。除此之外:如果您真的意识到可能的性能问题,请执行基准测试。我怀疑你会遇到任何问题....文件系统的速度应该是限制因素。

答案 6 :(得分:0)

read()和readlines()之间的真正区别 read函数只是将文件原样加载到内存中。 readlines方法将文件读取为没有行终止的行列表。 readlines方法只应用于文本文件,并且不应在大文件上使用。 如果从文本文件中复制信息,则读取效果很好,因为可以使用write函数输出,而无需添加行终止。

答案 7 :(得分:-1)

都不是。他们俩都会将内容读入内存。 对于大文件,迭代文件对象一次只加载一行文件,这可能是处理大文件内容的好方法。