作者 | Christopher Tao
译者 | IT外文选刊
比较在Python中用"+"和join()方法连接字符串。
当我开始使用Python时,很直观、很容易就想到使用加法运算符+来连接字符串,就像很多编程语言如Java一样。
然而,很快我就意识到,很多开发者似乎都喜欢用.join()方法而不是+。在这篇文章中,我将介绍这两种方法的区别是什么,以及为什么你不应该使用+。
开始
作为一个初学者,或者是刚刚从其他语言中转过来的人,用+来连接字符串,写出这样的代码是非常容易的:
str1 = "I love "
str2 = "Python."
print(str1 + str2)
随着你对Python的使用越来越多,你可能会意识到别人更喜欢使用像这样的join()方法:
str1 = "I love "
str2 = "Python."
print(''.join([str1, str2]))
说实话,当我第一次看到上面的方法的时候,我就在想,这个方法不直观,看起来有点难看。
Join多个字符串
尽管如此,有一次我需要在一个列表中加入多个字符串。
strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']
最初,我是这样做的:
strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']
def join_strs(strs):
result = ''
for s in strs:
result += ' ' + s
return result[1:]
join_strs(strs)
在这个例子中,我需要写一个for循环来逐一连接字符串。另外,最终result字符串需要去掉我在开始的时候加的一个空白符,因为所有的字符串都需要在前面加一个空白符号,但是第一个字符串不需要。你可能会有其他的解决办法,比如在for循环中添加一个索引,让index=0处的字符串不应该加这个留白。总之,你还是会需要这个for循环,并对这些空白做一些处理。
写完之后,我想起来以前见过.join()方法,也许这个时候就需要用到这个方法了!
多么简单啊!一行代码就能完成一切。因为.join()方法是由一个字符串对象调用的,所以这个字符串对象将被用来连接列表中的每一个字符串,所以你不需要担心开头的空格。
但是,等等,你真的认为这就是我们需要使用join()方法而不是+的唯一原因吗?不,请阅读下一节。
join()方法背后的逻辑
现在,我们来比较一下这两种方法的性能。我们可以用Jupyter Notebook的神奇方法%timeit来测评它们。
上图中的性能是基于100k的轨迹,所以结果非常有把握,也很明显。使用join()方法可以比使用+来连接列表中的字符串快4倍。
为什么会这样?
下面是我画的一个概念图,用来演示用+连接字符串的方法。
这显示了for循环和+运算符的作用:
- 对于每次循环,从列表中找到字符串
- Python 执行器解释表达式 result += ‘ ‘+ s,并为’ ‘空白字符申请内存地址
- 然后,执行器意识到空白字符需要用一个字符串连接,所以它将为字符串 s 申请内存地址,这就是第一个循环的生命周期
- 对于每一次循环,执行器需要申请两次内存地址,一次为空白字符,另一次为字符串
- 总共有12次内存分配
然而,Join()方法是怎么回事?
- 执行者会计算出列表中的字符串有多少个——有6个。
- 这意味着用于连接列表中的字符串的字符串需要重复6-1=5次。
- 它知道需要有11个内存空间,所以会一次性全部应用,并提前分配。
- 把这些字符串按顺序放好,返回结果。
所以,很明显,主要的区别在于内存分配的次数,是性能提升的主要原因。
试想一下,如果用join()方法把6个字符串连接在一起,速度已经快了4倍。如果我们在连接数量非常多的字符串呢?那就会有更大的差别!
总结
在这篇短文中,我比较了在Python中连接字符串时+操作符和join()方法的区别。显然,由于其性能的原因,人们更倾向于使用join()方法。
学习一门编程语言通常是一条漫长的道路,但Python对于初学者来说,它的学习时间相对较短,这绝对是非常棒的。当我们入门,开始使用Python之后,我们不应该止步于此,满足于能用Python做什么就用什么。通常情况下,高手和普通的开发者的区别就来自于细节方面的知识。
让我们继续寻找更多的Python技巧,让自己离Python大师更近一步!
外文链接:
https://towardsdatascience.com/do-not-use-to-join-strings-in-python-f89908307273towardsdatascience.com版权声明:
本译文仅用于学习、研究和交流目的,欢迎非商业转载。转载请注明出处、译者和IT外文选刊的完整链接。
更多优质IT外文在“IT外文选刊”(公众号)