就功能而言,两种方法没有区别; 两种方法都会得到完全相同的列表。
实现方式不同,其中一种使用文件对象作为迭代器(重复调用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;您可以多快从磁盘中读取它。在微观层面上,性能可能取决于其他因素,例如操作系统是否已缓冲数据以及行有多长。