从Python2 Tutorial和Python3 Tutorial开始,第7.2.1节中间有一行说:
如果您想阅读列表中文件的所有行,您还可以使用
list(f)
或f.readlines().
所以我的问题是:将文件对象转换为列表的这两种方法有什么区别?我对性能方面和Python对象实现(以及Python2和Python3之间的区别)感到好奇。
答案 0 :(得分:12)
在功能上,没有区别;两种方法都会产生完全相同的列表。
实现明智的做法是,将文件对象用作iterator(重复调用next(f)
直到StopIteration
被引发),另一个使用专用方法来读取整个文件。
Python 2和3的含义完全相同,除非你在Python 2中使用io.open()
。Python 2文件对象use a hidden buffer for file iteration,如果你混合文件对象迭代和{ {1}}或.readline()
来电。
.readlines()
库(处理Python 3中的所有文件I / O)不使用这样的隐藏缓冲区,所有缓冲都由BufferedIOBase()
wrapper class处理。事实上,io.IOBase.readlines()
implementation使用文件对象作为迭代器无论如何和TextIOWrapper
iteration delegates to TextIOWrapper.readline()
,因此io
和list(f)
基本上是同样的,真的。
性能方面,即使在Python 2中也没有什么区别,因为瓶颈是文件I / O;你能多快从磁盘上读取它。在微观层面,性能可能取决于其他因素,例如操作系统是否已经缓冲了数据以及线路的长度。