字符串连接,就是将2个或以上的字符串合并成一个,看上去连接字符串是一个非常基础的小问题,但是在Python中,我们可以用多种方式实现字符串的连接,稍有不慎就有可能因为选择不当而给程序带来性能损失。

方法1:加号连接

很多语言都支持使用加号连接字符串,Python也不例外,只需要简单的将2个或多个字符串相加就可以完成拼接。

1
2
3
a = 'Python'
b = '私房菜'
r = a + b # 输出'Python私房菜'

方法2:使用%操作符

在Python 2.6以前,%操作符是唯一一种格式化字符串的方法,它也可以用于连接字符串。

1
2
3
a = 'Python'
b = '私房菜'
r = '%s%s' % (a, b) # 输出'Python私房菜'

方法3:使用format方法

format方法是Python 2.6中出现的一种代替%操作符的字符串格式化方法,同样可以用来连接字符串。

1
2
3
a = 'Python'
b = '私房菜'
r = '{}{}'.format(a, b)

方法4:使用f-string

Python 3.6中引入了Formatted String Literals(字面量格式化字符串),简称f-string,f-string是%操作符和format方法的进化版,使用f-string连接字符串的方法和使用%操作符、format方法类似。

1
2
3
a = 'Python'
b = '私房菜'
r = f'{a}{b}'

方法5:使用str.join()方法

字符串有一个内置方法join,其参数是一个序列类型,例如数组或者元组等。

1
2
3
a = 'Python'
b = '私房菜'
r = ''.join([a, b])

对比测试

既然连接字符串有这么多方法,那么使用时到底选择哪种呢?我们从代码可读性和性能两个层面来评估一下上面5种方法。

使用timeit模块,分别执行上述5种方法的示例代码100000次,执行时间如图。

可以看到,%操作符、format和f-string都是字符串格式化方法,性能依次递增,加号连接的性能和f-string不相上下。

有一点需要注意的是,字符串类型是不可变的,所以每一次应用加号连接字符串都会生成一个新的字符串,连接多个字符串时,效率低下就是必然的了,我们将一次连接的字符串提升到10个和20个,再来进行2轮测试,下面是连接20个字符串时的耗时情况。

和连接两个字符串时的结果出现了一些不同,首先使用加号连接的方式在字符串数量较多时(大于10个),性能会急剧下降,str.join()方法在连接大量字符串时性能最好。

总结

连接少量字符串时
使用加号连接符在性能和可读性上都是明智的,如果对可读性有更高的要求,并且使用的Python 3.6以上版本,f-string也是一个非常好的选择,例如下面这种情况,f-string的可读性显然比加号连接好得多。

1
2
a = f'姓名:{name} 年龄:{age} 性别:{gender}'
b = '姓名:' + name + '年龄:' + age + '性别:' + gender

连接大量字符串时
joinf-string都是性能最好的选择,选择时依然取决于你使用的Python版本以及对可读性的要求,f-string在连接大量字符串时可读性并不一定好。切记不要使用加号连接,尤其是在for循环中。