Python中字符串连接,“+”的效率很低!

  1. 问题阐述:假如现在有两个字符串“Python”和“Ruby”,需要将这两个字符串连接起来,在Java或者C#中都可以通过使用“+”操作符将两个字符串连接一起,得到一个新的字符串“PythonRuby”。当然,Python中同样提供了利用“+”操作符连接字符串的功能,然而很不幸的是,这样的做法正是万恶之源
  2. “+”低效的原因:Python中通过“+”进行字符串连接的方法效率极其低下,其根源在于Python中的PyStringObject对象是一个不可变对象。这就意味着当进行字符串连接时,实际上是必须要创建一个新的PyStringObject对象。这样,如果要连接N个PyStringObject对象,那么就必须进行 N-1 次的内存申请及内存搬运的工作。毫无疑问,这将严重影响Python的执行效率。
  3. 官方推荐:做法是通过利用PyStringObject对象的join操作来对存储在list或者tuple中的一组PyStringObject对象进行连接操作,这种做法只需要分配一次内存,执行效率将大大提高。
  4. join执行过程:执行join操作时,会首先统计出在list中一共有多少个PyStringObject对象,并统计这些PyStringObject对象所维护的字符串一共有多长,然后申请内存,将list中所有的PyStringObject对象维护的字符串都拷贝到新开辟的内存空间中。注意:这里只进行了一次内存空间的申请,就完成了N个PyStringObject对象的连接操作。相比于“+”操作符,待连接的PyStringObject对象越多,效率的提升也会越明显。
  • join()的用法:
    str.join(sequence)    其中,str是要连接字符串的 连接符;sequence是要连接的元素序列。
  • 示例演示:
# join操作示例:
>>> str1 = "hello"
>>> str2 = "world"
>>> str3 = "!"
>>> "".join([str1,str2,str3])
'helloworld!'
>>> "#".join([str1,str2,str3])
'hello#world#!'
>>>

 

你可能感兴趣的:(Python相关学习)