在Python中最有效的字符串连接方法是什么?
在Python中,有没有一种高效的批量字符串连接方法?就像C#中的StringBuilder或者Java中的StringBuffer那样?
我找到了一些方法,具体可以在这里查看:
- 简单的用
+
进行连接 - 使用字符串列表和
join
方法 - 使用
MutableString
模块中的UserString
- 使用字符数组和
array
模块 - 使用
StringIO
模块中的cStringIO
应该使用哪种方法,为什么呢?
(相关问题在这里。)
13 个回答
通常来说,''.join(sequence_of_strings)
是最有效的方法——既简单又快速。
如果你提前知道所有的组件,可以使用一种叫做字面字符串插值的方式,也就是我们常说的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正式版之前得到了改善。)