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

方法 1:加号连接

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

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

方法 2:使用%操作符

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

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

方法 3:使用 format 方法

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

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

方法 4:使用 f-string

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

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

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

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

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 的可读性显然比加号连接好得多。

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

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