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

Pro*_*mer 19 python io

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

for line in fileHandle
Run Code Online (Sandbox Code Playgroud)

Dun*_*can 22

对于一个文本文件,只需用循环迭代就可以了for.没关系速度,它是最干净的.

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

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

将迭代文件与for line in file混合并调用文件对象的read()/ readline()/ readlines()方法现在是非法的.

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

Python 2.7固定交织read()readline().


ts.*_*ts. 15

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

Readline只读取一行,所以我认为这是大文件的更好选择.

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

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

  • 内部缓冲旨在避免过多的磁盘搜索,而无需将整个文件加载到内存中 (4认同)
  • 当文件迭代器最初被引入时,`readline`对迭代器的缓冲区一无所知:参见PEP 234,它说迭代器因此而快得多.然而,当人们试图将`readline`调用混合到迭代器循环的中间时,这会引起问题,因此它在更高版本中被修复,现在`readline`使用相同的缓冲区.我不确定究竟是哪个版本:2.7修复了问题交错`read`和`readline`但我认为`readline`&iterator修复更早. (2认同)

Joh*_*ooy 7

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

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