在Python中,f.readlines()和list(f)有什么区别?

10

Python2教程Python3教程中,第7.2.1节的中间有一句话:

如果你想要把文件中的所有行转换成列表,你也可以使用list(f)或者f.readlines()

所以我的问题是:将文件对象转换为列表的这两种方法有什么区别?我既关心性能方面,也关心Python对象实现的底层细节(也许还有Python2和Python3之间的差异)。

1个回答

13

就功能而言,两种方法没有区别; 两种方法都会得到完全相同的列表。

实现方式不同,其中一种使用文件对象作为迭代器(重复调用next(f)直到引发StopIteration),另一种使用专用方法来读取整个文件。

在Python 2和3中,除非您在Python 2中使用io.open(),否则两者的含义有所不同。Python 2文件对象对文件迭代使用隐藏缓冲区,如果您混合使用文件对象迭代和.readline().readlines()调用可能导致问题。

io库(在Python 3中处理所有文件I/O)不使用这样的隐藏缓冲区,所有缓冲区都由BufferedIOBase()包装类处理。实际上,io.IOBase.readlines()实现在底层使用文件对象作为迭代器,而TextIOWrapper迭代则委托给TextIOWrapper.readline(),因此list(f)f.readlines()实质上是相同的。

就性能而言,即使在Python 2中也没有真正的区别,因为瓶颈是文件I / O;您可以多快从磁盘中读取它。在微观层面上,性能可能取决于其他因素,例如操作系统是否已缓冲数据以及行有多长。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接