Python札记4:连接字符串使用join还是+号

你应该知道,连接字符串既可以用join函数,也可以用+号:

a = "hello " + "world"
b = " ".join(["hello", "world"])
print(a) # hello world
print(b) # hello world

两种方法的输出是相同的,那么它们的性能有什么区别呢?我们来做个试验:

import timeit

def concat1(strlist):
  return "".join(strlist)

def concat2(strlist):
  result = ""
  for s in strlist:
    result += s
  return result

if __name__ == "__main__":
  strlist = ["a very long string" for n in range(100000)]
  timer1 = timeit.Timer("concat1(strlist)", "from __main__ import strlist, concat1")
  timer2 = timeit.Timer("concat2(strlist)", "from __main__ import strlist, concat2")
  t1 = timer1.timeit(number=100)
  t2 = timer2.timeit(number=100)
  print("join: {:.2f}, plus: {:.2f}".format(t1, t2)) # 输出 join: 0.18, plus: 2.00 

我们用timeit模块对两个函数进行了测试,可以看到,join函数的速度约为使用+号运算符的11倍(不同设备上的结果可能不同)。原因如下:

使用+号时,如果有两个字符串拼接,则创建一块新的内存,然后将拼接后的结果拷贝到新内存块中,接着继续拼接余下的字符串,又会进行同样的操作,假如拼接100次,那么就会进行100次内存分配操作;同时,过程中还会伴随不停地销毁不再需要的字符串,所以是非常耗时的。如下图所示:

在这里插入图片描述

使用join函数时,首先会计算所有要拼接字符串的总长度,然后一次性分配所有内存;接着将所有字符串全部拼接起来,放入该内存块中。如下图所示:

在这里插入图片描述

所以,在连接字符串时,优先考虑使用join函数。


我的知乎:奔三的鑫鑫

欢迎关注微信公众号:小鑫的代码日常

欢迎加入Python学习交流群:532232743,这里有各路高手等着你~

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页