来自两者Python2教程 https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects and Python3教程 https://docs.python.org/3.4/tutorial/inputoutput.html#methods-of-file-objects, 中点有一条线第 7.2.1 节 saying:
如果你想读取一个文件的所有行在列表中你也可以使用list(f)
or f.readlines().
所以我的问题是:这两种将文件对象转换为列表的方法有什么区别?我对性能方面和底层 Python 对象实现(也许还有 Python2 和 Python3 之间的差异)感到好奇。
从功能上来说,没有什么区别;两种方法都会产生完全相同的列表。
在实现方面,人们使用文件对象作为iterator https://docs.python.org/2/glossary.html#term-iterator (calls next(f)
反复直到StopIteration
被提出),另一个使用专用方法来读取整个文件。
Python 2 和 3 的具体含义有所不同,除非您使用io.open() https://docs.python.org/2/library/io.html#io.open在 Python 2 中。Python 2 文件对象使用隐藏缓冲区进行文件迭代 https://docs.python.org/2/library/stdtypes.html#file.next,如果你混合文件对象迭代和.readline()
or .readlines()
calls.
The io
库(处理 Python 3 中的所有文件 I/O)不使用这样的隐藏缓冲区,所有缓冲都由BufferedIOBase()包装类 https://docs.python.org/2/library/io.html#io.BufferedIOBase。事实上,io.IOBase.readlines()执行 http://hg.python.org/cpython/file/8c96af2fba28/Modules/_io/iobase.c#l585使用文件对象作为底层的迭代器anyway, and TextIOWrapper迭代委托给TextIOWrapper.readline() http://hg.python.org/cpython/file/8c96af2fba28/Modules/_io/textio.c#l2497, so list(f)
and f.readlines()
本质上是同一件事,真的。
在性能方面,即使在 Python 2 中也没有真正的区别,因为瓶颈是文件 I/O;从磁盘读取它的速度有多快。在微观层面上,性能可能取决于其他因素,例如操作系统是否已经缓冲了数据以及线路的长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)