我正在查看 StringIO
的源代码,它说了一些注释:
- 使用真实文件通常更快(但不太方便)。
- 在 C 中还有一个更快的实现,称为
cStringIO
,但是 它不可继承。
StringIO
就像一个内存文件对象,
为什么它比真正的文件对象慢?
最佳答案
这不是实际上是关于 Python 的解释性质:BytesIO
是在 Python* 中实现的,与 StringIO
相同,但仍然优于文件 I/哦。
事实上,在 StringIO
的理想用例(单次写入空缓冲区的开头)下,StringIO
比文件 I/O 更快。实际上,如果写入足够大,它甚至会击败 cStringIO
。看我的问题here .
那么为什么 StringIO
被认为是“慢”的呢? StringIO
的真正问题是由不可变序列 支持的,无论是str
还是unicode
。显然,如果你只写一次,这很好。但是,正如 tdelaney's answer 指出的那样对于我的问题,它在写入随机位置时会减慢很多(例如 10-100 倍),因为每次它在中间写入时都必须复制整个支持序列。
BytesIO
没有这个问题,因为它由(可变的)bytearray
支持。同样,无论 cStringIO
做什么,它似乎都更容易处理随机写入。我猜它在内部打破了不变性规则,因为 C 字符串是可变的。
* 无论如何,_pyio
中的版本是。 io
中的标准库版本是用 C 语言编写的。
关于python - 为什么 StringIO 对象比真实文件对象慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25580925/