避免使用“+”操做符在python中链接字符串

翻译自Do Not Use “+” to Join Strings in Python
java

避免使用“+”操做符在python中链接字符串

  当我开始使用python时,因为很是直观所以经常使用+来链接字符串——正如许多其余程序设计语言如java的链接方式。
  可是,很快我发现许多开发者彷佛更喜欢使用.join()而非+.本文将介绍二者之间的区别以及为何你须要避免使用+.python

开始

  做为初学者,或者从其余语言转向python的开发者,很容易将代码写为下面的形式:web

str1 = "I love "
str2 = "python."
print(str1 + str2)
# I love python

  当你使用python愈来愈多时,你可能意识到有些人更喜欢使用join()方法:编程

str1 = "I love "
str2 = "python."
print(''.join([str1, str2])
# I love python

  老实说,当我第一次看见上面这种写法是,我想的是为何须要这种不直观且看上去很抽象的方式。编程语言

链接多个字符串

  然而,有一次我须要将一个列表中的多个字符串链接起来。svg

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']

  一开始,我写下了以下代码:oop

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']

def join_strs(strs):
    result = ''
    for s in strs:
        result +=' ' + s
    return result[1:]

join_strs(strs)
# 'Life is short, I use Python'

  在这个例子中,我必须使用一个for循环来一个接一个地链接字符串。同时,循环中的字符串必须前面统一加上一个空格以保证最终结果的每一个字符串前面都有一个空格——固然第一个字符串是例外。固然你能够经过断定索引来保证index=0时空格不会被加到字符串前。但不管如何你都须要一个for循环来作这些事。
  在写下这段代码后,我会想起我曾经看到过.join()方法,也许是时候使用它了:性能

strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']

def join_strs_better(strs):
    return ' '.join(strs)

join_strs_better(strs)
# 'Life is short, I use Python'

  这是多么容易!只须要一行代码全部问题都被解决了。因为.join()方法被一个字符串对象调用——这个字符串对象使用列表中的全部字符串来生成一个新的字符串——所以你无需担忧开头会被添加一个多余的空格。
  你不会真的觉得这是咱们避免使用+的惟一理由吧?下一节将介绍更多二者的区别!学习

join()方法背后的逻辑

  咱们相对两种方法的性能作出对比,经过在Jupyter Notebook中使用%timeit来评估:
在这里插入图片描述ui

这段代码是在译者的笔记本跑的,cpui7-7700hq,若是在您本身的电脑上跑cpu的性能将决定时间长短)


  基于100k次实验的结果是值得相信的。很明显,join()方法比使用+快了4倍有余。
  为何会这样?
  下面是使用+时的概念图


Using + operator and for-loop to join strings in a list

这展现了for循环和+操做符的步骤:

  1. 每次循环发现列表中的下一个字符串
  2. python执行器执行语句result += ' ' + s,分配表示' '的内存
  3. python执行器发现空格须要和字符串链接起来,所以它将为发现的字符串申请内存地址,第一次循环的字符串为“Life”
  4. 每次循环,执行器都须要分配两次内存地址,一次分配给空格一次分配给当前循环的字符串
  5. 总共12次内存分配

join()方法被调用时会发生什么?
Using “join()” method to join strings in a list

  1. 执行器计算列表中由多少个字符串(6个)
  2. 经过上一步执行器知道须要执行字符串链接共6-1=5次
  3. 上两步的结果使执行器知道总共须要分配11块内存空间,所以将一次性地提早调用11块内存空间
  4. 将字符串按顺序链接,返回结果

  很显然两种方法的主要区别就在于内存调用次数致使的性能提高。
  想象一下对六个字符串的链接,join()方法已经比+快四倍还多。那若是咱们须要链接很大数量的字符串呢?显然二者会有更大的差别。

总结

  在这篇短文中,我将python中+join()两种链接字符串的方法进行了对比。显而后者的表现优于前者许多。
  学习一种编程语言一般是是一个很长的曲线,可是Python使得初学者更加容易接受——这无疑是很棒的。可是当咱们入门并开始使用Python后,咱们不该该停留在以前所使用Python的方式。实际上,大师和普通开发者的区别每每来自于对细节的了解。
   让咱们继续发现更多Python编程的细节来使本身更加精通Python!

单词

  • comparison 比较
  • intuitive /ɪn’tuɪtɪv/直观
  • conceptual graph概念图
  • allocations /ˌælə’keʃən/调用
  • %timeit jupyter notebook计时