来自Python2 Tutorial和 Python3 Tutorial , section 7.2.1 的中点有一行说:
If you want to read all the lines of a file in a list you can also use
list(f)
orf.readlines().
所以我的问题是:这两种将文件对象转为列表的方式有什么区别?我很好奇性能方面和底层 Python 对象实现(可能还有 Python2 和 Python3 之间的区别)。
最佳答案
在功能上,没有区别;两种方法都会产生完全相同的列表。
在实现方面,将文件对象用作 iterator (重复调用 next(f)
直到引发 StopIteration
),另一个使用专用方法读取整个文件。
Python 2 和 3 的含义完全不同,除非您使用 io.open()
在 Python 2 中。Python 2 文件对象 use a hidden buffer for file iteration ,如果您混合使用文件对象迭代和 .readline()
或 .readlines()
调用,这可能会让您感到困惑。
io
库(在 Python 3 中处理所有文件 I/O)不使用这样的隐藏缓冲区,所有缓冲都由 BufferedIOBase()
wrapper class 处理。 .事实上,io.IOBase.readlines()
implementation在后台使用文件对象作为迭代器无论如何,并且TextIOWrapper
iteration delegates to TextIOWrapper.readline()
,所以 list(f)
和 f.readlines()
本质上是同一件事,真的。
在性能方面,即使在 Python 2 中也没有真正的区别,因为瓶颈是文件 I/O;你能多快从磁盘读取它。在微观层面上,性能可能取决于其他因素,例如操作系统是否已经缓冲了数据以及行的长度。
关于python - 在 Python 中,f.readlines() 和 list(f) 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958198/