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

标签 python list file file-io python-internals

来自Python2 TutorialPython3 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) or f.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/

相关文章:

用于 RESTful 应用程序的 Python 微框架?

python - 当我移动鼠标时,为什么我的 pygame 程序会变慢?

Python递归向后打印列表中的项目

java - 如何打开 List<Map>,按 Map 键分组并按 Map 值缩减

c - 在c中将字符串数组写入文件

python - MySQLdb 正在缓存 SELECT 结果?

python - 使用flask-sqlalchemy将字典列表保存到数据库

list - AssertJ:containsOnly和containsExactlyInAnyOrder有什么区别

python - 确保 matlab 的 `fread` 的 python 等价性

linux - 两个文件与 while .sh 的比较