你所不知道的Python | 字符串连接的秘密——连接大量字符串时 join和f-string都是性能最好的选择
你所不知道的Python | 字符串连接的秘密
字符串连接,就是将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
连接大量字符串时
join和f-string都是性能最好的选择,选择时依然取决于你使用的Python版本以及对可读性的要求,f-string在连接大量字符串时可读性并不一定好。切记不要使用加号连接,尤其是在for循环中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2018-03-25 leetcode 453. Minimum Moves to Equal Array Elements
2018-03-25 leetcode 492. Construct the Rectangle
2018-03-25 leetcode 598. Range Addition II
2018-03-25 leetcode 349. Intersection of Two Arrays
2018-03-25 leetcode 171. Excel Sheet Column Number
2017-03-25 es的forcemerge——按照天分割
2017-03-25 facebook Presto SQL分析引擎——本质上和spark无异,分解stage,task,MR计算