python - 为什么 StringIO 对象比真实文件对象慢?

标签 python stringio cstringio

我正在查看 StringIO 的源代码,它说了一些注释:

  1. 使用真实文件通常更快(但不太方便)
  2. 在 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/

相关文章:

javascript - jQuery 在执行 Python 脚本 PHP 时加载 img

python - 如何使用 Python 从 zip 文件中去除密码加密

python - 单元测试 - 用 StringIO 对象替换文件路径

python - 在内存流中进行编码或 TextIOBase 如何工作?

python - 在 python 中使用生成器和 cStringIO 来流式传输字符串

python 不显示 Windows 安装日期

python - 如何调试 HTTP 502 错误?

python - 合并未知数量的列表,只保留共同的值

Python 的 StringIO 不能很好地处理 `with` 语句

python 如何连接 stringio 对象?