为什么字符串连接的列表比字符数组快

时间:2013-08-29 00:36:03

标签: python string

在下面链接的文章中,作者比较了python中不同字符串连接方法的效率: http://www.skymind.com/~ocrow/python_string/

我不明白的一件事是,为什么方法3(可变字符阵列)导致性能明显慢于方法4(加入字符串列表)

它们都是可变的,我认为它们应具有相似的性能。

1 个答案:

答案 0 :(得分:4)

“它们都是可变的”会误导你一点。

在list-append方法中,列表是可变的。但建立清单并不是缓慢的部分。如果你有1000个平均长度为1000的字符串,你就会对数组进行1000000次突变,但是列表中只有1000个突变(加上1000个增量到字符串对象)。

特别是,这意味着array必须花费1000倍的时间来扩展(分配新存储并复制到目前为止的所有内容)。

list方法的缓慢部分是最后的str.join调用。但是不是可变的,并且不需要任何扩展。它使用两遍,首先计算所需的大小,然后将所有内容复制到其中。

此外,str.join内部的代码已经(并且自9年前撰写以来一直有这篇文章)需要做很多工作来优化它,因为它是一种非常常见且推荐的习惯用法。真正的节目取决于每一天; array因为它首次添加到语言中而几乎没有被触及过。

但如果你真的想了解这些差异,你必须看看来源。在2.7中,数组方法的主要工作在array_fromstring,而list方法的主要工作在string_join。你可以看到后者如何利用我们已经知道我们将在开始时加入的所有字符串这一事实,而前者不能。