字符串串联,以防止内存中两个字符串移动



为了连接两个字符串,内存管理器将尝试重新分配一个字符串的内存位置,以便另一个字符串能够将另一个字符串放在旁边的内存中。 迭代字符串的时间复杂度 https://stackoverflow.com/a/34008199/8366477Is 实际追加 O(n^2( 还是 O(n(? 如果它无法重新分配到位,那么它将不得不将两者移动到新的内存位置。

问题是为了避免将两个字符串移动到新的内存位置的这种开销,是否有一种首选的、有效的方法来连接 Python 中的两个字符串。 我正在考虑使用 StringIO 将其制作成文本缓冲区? 你有什么想法?

对于只有两个字符串,big-O 是无关紧要的,因为您无法改进它。a + b很好;您无法摊销增长,因此只需将它们连接起来,对新字符串执行一个分配,并将两个副本复制到该单个分配中,每个源一个。

对于大量字符串,标准的 Python 方法是创建一个tuple(对于同时已知的许多字符串(或list(对于一组零碎构建的字符串(并对其调用''.join(seq)str.join计算所有输入的组合长度,为结果预分配缓冲区,并将每个组件一个接一个地复制到该缓冲区中,保持运行时O(n)

您可以使用io.StringIO来实现类似的效果,但这不是必需的,并且在引擎盖下,它必须做类似的工作来构建listjoin它。

最新更新