在下面链接的文章中,作者比较了python中不同字符串连接方法的效率: http ://www.skymind.com/~ocrow/python_string/
我不明白的一件事是,为什么方法 3(可变字符数组)导致性能明显低于方法 4(加入字符串列表)
它们都是可变的,我认为它们应该具有可比的性能。
在下面链接的文章中,作者比较了python中不同字符串连接方法的效率: http ://www.skymind.com/~ocrow/python_string/
我不明白的一件事是,为什么方法 3(可变字符数组)导致性能明显低于方法 4(加入字符串列表)
它们都是可变的,我认为它们应该具有可比的性能。
“它们都是可变的”有点误导你。
确实,在 list-append 方法中,列表是可变的。但建立清单并不是缓慢的部分。如果您有 1000 个平均长度为 1000 的字符串,那么您将对数组进行 1000000 次突变,但对列表仅进行 1000 次突变(加上字符串对象的 1000 次增量)。
特别是,这意味着array
将不得不花费 1000 倍的时间进行扩展(到目前为止,分配新的存储空间并复制整个内容)。
list 方法的缓慢部分是最后的str.join
调用。但这不是可变的,也不需要任何扩展。它使用两次传递,首先计算所需的大小,然后将所有内容复制到其中。
此外,其中的代码str.join
已经(并且自 9 年前撰写该文章以来一直如此)进行了大量优化工作,因为它是许多实际程序每天都依赖的非常常见且推荐的习语;array
自从它第一次被添加到语言中以来,几乎没有被触及过。
但是,如果您真的想了解差异,则必须查看源代码。在 2.7 中,数组方法的主要工作是 in array_fromstring
,而 list 方法的主要工作是 in string_join
。您可以看到后者如何利用我们已经知道我们将在一开始就加入的所有字符串这一事实,而前者却不能。