擅长:python、mysql、java
<p>正如Lattyware所提到的,对于空字符串替换,它是一个特殊情况,<code>replace_interleave</code>,这是一个直接的循环,其中,源字符串和来自字符串的备用字符被复制到结果字符串。循环被编码为越快越好。在</p>
<pre><code>count = self_len+1;
count -= 1;
Py_MEMCPY(result_s, to_s, to_len);
result_s += to_len;
for (i=0; i<count; i++) {
*result_s++ = *self_s++;
Py_MEMCPY(result_s, to_s, to_len);
result_s += to_len;
}
/* Copy the rest of the original string */
Py_MEMCPY(result_s, self_s, self_len-i);
</code></pre>
<p>Join方法也有一个循环,但是还有一些地方需要改进(通过我还没有找到所有方面的原因,可以按照下面的方式进行编码)和瓶颈的原因。在</p>
^{pr2}$
<p>如你所见,在一个循环内</p>
<ul>
<li>字符串的每一项都被编入索引</li>
<li>确定项目的大小</li>
<li>已将项转换为字符串</li>
</ul>
<p>上述三种操作,即使可能是串联的,也有相当大的开销。<strong><em>注意</em></strong>这也解释了为什么使用一个列表与使用字符串会有不同的结果,正如混合</p>
<p>同时比较两个循环</p>
<p>前者</p>
<ul>
<li>很容易成为<a href="http://gcc.gnu.org/projects/tree-ssa/vectorization.html" rel="nofollow">auto vectorized</a></li>
<li>缓存友好。在</li>
</ul>
<p><strong>最后一句话</strong></p>
<p>在编写<code>str.join</code>时,要记住所有形式的iterable和sequences,而不仅仅是字符串,而且在没有详细说明的情况下,它很有希望的是,通用例程的执行速度可能不如为特定形式的数据提供服务的专用例程快。在</p>