【Python3】连接字符串优先使用join
finally中的陷阱
字符串处理在多数编程程序语言中不可避免,字符串的连接也是在编程中经常需要面对的问题。Python中的字符串与其他程序语言如:C++、Java有一些不同,它为不可变对象,一旦创建就不能改变它的这个特性直接影响到Python中字符串连接的效率。我们首先来看下常见的两种字符串连接方法。
- 使用操作符+连接字符串的方法如下
str1, str2, str3 = 'str1', 'str2', 'str3'
newstr = str1 + str2 + str3
# newstr>>>: str1str2str3
2. 使用join方法连接字符串的方法如下
str1, str2, str3 = 'str1', 'str2', 'str3'
newstr = ''.join([str1, str2, str3])
# newstr>>>: str1str2str3
思考这么一个问题:上述两种字符串连接方式除了使用形式不同还有其他的区别吗?性能上会不会有所差异呢?
使用join()方法连接字符串效率要高于+操作符,特别是字符串规模大的时候,join()方法的优势会更加明显(如果连接数为100000时候,两者耗时相差百倍)。
1.操作符“+”连接分析
造成这种差别的原因在哪里呢?我们来探讨一下,当用操作符+连接时候,由于字符串是不可变对象,其工作原理实际上是这样的:如果要连接如下字符串:s1 + s2 + s3+ ......sn,执行一次+操作便会在内存中申请一块新的内存空间,并将上一次操作的结果和本次操作数复制到新申请的内存空间,既当执行s1 + s2 的时候会申请一块内存,并将s1,s2复制到该内存中,依次类推,因此,在n个字符串连接的过程中,会产生n-1个中间结果,每产生一个中间结果都需要申请和复制一次内存,总共需要申请n-1次的内存,从而严重影响了执行效率。n越大,堆内存的申请和复制次数就越多,+操作符的效率就越低。因此整个字符串连接的过程中,相当于s1被复制n-1次,s2被复制n-1次,sn复制1次,所以字符串的连接时间复杂度近似为O(N^2)。
2.join() 连接分析
相对而言join()方法连接字符串的时候,会首先计算需要申请的总的内存空间,然后一次性申请所需内存并将字符序列中的每一个元素复制到内存中去,所以操作的时间复杂度为O(n)。
因此,字符串的连接,特别是量大规模的处理,应该尽量使用join()而不是“+”。

浙公网安备 33010602011771号