面试python岗位,提问:链接字符串用join仍是+,怎么回答?

Python学习

本篇要讲的是,链接字符串的时候能够用join也能够用+,但这二者有没有区别呢? 关注公众号:「Python专栏」,后台回复「腾讯架构资源1」,获取由腾讯架构师整理的大数据学习资源包全套!!!python

![Python专栏二维码](https://img-blog.csdnimg.cn/20190228220401806.jpeg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTIzNjU4Mjg=,size_4,color_FFFFFF,t_70#pic_center =200x200)数组

咱们先来看一下用join和+链接字符串的例子架构

str1 = " ".join(["hello", "world"])
str2 = "hello " + "world"

print(str1)  # 输出 “hello world"
print(str2)  # 输出 “hello world"

二者的结果是同样,那么考虑这样一个问题,这二者在性能上有区别吗? 咱们来作个实验,比较下join和+的性能性能

import timeit

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

def test2(strlist):
    result = ""
    for v in strlist:
        result = result+v
    return result

if __name__ == "__main__":
    strlist = ["a very very very very very very very long string" for n in range(100000)]
    timer1 = timeit.Timer("test1(strlist)", "from __main__ import strlist, test1")
    timer2 = timeit.Timer("test2(strlist)", "from __main__ import strlist, test2")
    time1 = timer1.timeit(number=100)
    time2 = timer2.timeit(number=100)
    print("join: %f, plus: %f" % (time1, time2))

那么这里咱们不对timeit模块作过多解释,大家能够理解为是一个对代码效率进行检测运行耗时的模块。下次咱们单独起一篇来讲这个timeit。学习

上面的程序有以下的输出大数据

join: 0.116944, plus: 0.394379

能够看到,join的性能明显好于+。这是为何呢?code

缘由是这样的,字符串是不可变对象,当用操做符+链接字符串的时候,每执行一次+都会申请一块新的内存,而后复制上一个+操做的结果和本次操做的右操做符到这块内存空间,所以用+链接字符串的时候会涉及好几回内存申请和复制。对象

而join在链接字符串的时候,会先计算须要多大的内存存放结果,而后一次性申请所需内存并将字符串复制过去,这是为何join的性能优于+的缘由。blog

因此在链接字符串数组的时候,咱们应考虑优先使用join。内存