在Python中最有效的字符串连接方法是什么?

203 投票
13 回答
183713 浏览
提问于 2025-04-15 13:48

在Python中,有没有一种高效的批量字符串连接方法?就像C#中的StringBuilder或者Java中的StringBuffer那样?

我找到了一些方法,具体可以在这里查看:

  • 简单的用+进行连接
  • 使用字符串列表和join方法
  • 使用MutableString模块中的UserString
  • 使用字符数组和array模块
  • 使用StringIO模块中的cStringIO

应该使用哪种方法,为什么呢?

(相关问题在这里。)

13 个回答

71

通常来说,''.join(sequence_of_strings) 是最有效的方法——既简单又快速。

156

你可能会对这个内容感兴趣:Guido写的《一个优化的故事》。不过要记住,这是一篇旧文章,早于像''.join这样的东西的出现(虽然我想string.joinfields差不多是一样的)。

根据这个,array模块在某些情况下可能是最快的,如果你的问题可以适应它的话。但''.join可能已经“足够快”了,而且它的写法更符合Python的习惯,这样其他Python程序员更容易理解。

最后,优化的黄金法则是:除非你确定需要优化,否则不要去优化,并且要通过测量来判断,而不是随便猜测。

你可以使用timeit模块来测量不同的方法。这可以“告诉”你哪个方法最快,而不是让网上的陌生人来猜测。

127

如果你提前知道所有的组件,可以使用一种叫做字面字符串插值的方式,也就是我们常说的f-字符串或者格式化字符串,这个功能是在Python 3.6中引入的。

根据mkoistinen的回答中的测试案例,字符串如下:

domain = 'some_really_long_example.com'
lang = 'en'
path = 'some/really/long/path/'

在我的电脑上使用Python 3.6和Linux,通过IPython和timeit模块测得的不同方法及其执行时间如下:

  • f'http://{domain}/{lang}/{path}' - 0.151 微秒

  • 'http://%s/%s/%s' % (domain, lang, path) - 0.321 微秒

  • 'http://' + domain + '/' + lang + '/' + path - 0.356 微秒

  • ''.join(('http://', domain, '/', lang, '/', path)) - 0.249 微秒(注意,构建一个固定长度的元组比构建一个固定长度的列表稍微快一点)。

所以,最简洁和最优雅的代码也是最快的。


这个速度可以和Python 2中最快的方法进行对比,我电脑上的+拼接方法需要0.203 微秒,使用8位字符串时,如果字符串都是Unicode,则需要0.259 微秒。

(在Python 3.6的早期版本中,f''字符串的实现是最慢的,实际上生成的字节码几乎等同于''.join()的情况,并且有不必要的调用str.__format__,而这个方法如果没有参数只会返回未改变的self。这些效率问题在3.6正式版之前得到了改善。)

撰写回答