连接字符串的时候可以用join也可以用+,但这两者有没有区别呢?

我们先来看一下用join和+连接字符串的例子

str1 = " ".join(["hello", "world"])
str2 = "hello " + "world"
print(str1) # 输出 “hello world"
print(str2) # 输出 “hello world"

两者的结果是一样,那么考虑这样一个问题,这两者在性能上有区别吗?

我们来做个实验,比较下join和+的性能

import timeit,time
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(1000)]
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)) strlist1 = ["very very very long long" ,"very long long long","very long long long","very long long long","very long long long"]
time1 = time.time()
for i in range(100000):
test1(strlist1)
time2 = time.time()
time3 = time.time()
for i in range(100000):
test2(strlist1)
time4 = time.time()
print ("join:%s" %(time2-time1))
print("+ :%s" % (time4-time3))

输出:

join: 0.003507, plus: 0.083788
join:0.18189620971679688
+ :0.3727850914001465

  

可以看到,join的性能明显好于+。这是为什么呢?

原因是这样的,字符串是不可变对象,当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,因此用+连接字符串的时候会涉及好几次内存申请和复制。而join在连接字符串的时候,会先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去,这是为什么join的性能优于+的原因。所以在连接字符串数组的时候,我们应考虑优先使用join

join和+的区别的更多相关文章

  1. join 和 union 区别

    JOIN和UNION区别 join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 .JOIN用于按照ON条件联接两个表 ...

  2. sql的left join 、right join 、inner join之间的区别

    sql中left join .right join .inner join之间的区别 left join (左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 : right join (右 ...

  3. inner join 与 left join 之间的区别

    关于inner join 与 left join 之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题出在inner join 上了. 需求是从数据库查数据,在前端以 ...

  4. Oracle中 (+)与left join 的用法区别

    Oracle中 (+)与left join 的用法区别 原创 2017年01月11日 13:33:42 6648 select * from a,b where a.id=b.id(+); (+)写在 ...

  5. inner join(inner可省) 与 left join 之间的区别

    关于inner join 与 left join 之间的区别,以前以为自己搞懂了,今天从前端取参数的时候发现不是预想中的结果,才知道问题出在inner join 上了. 需求是从数据库查数据,在前端以 ...

  6. 1.JOIN和UNION区别

    1.JOIN和UNION区别join 是两张表做交连后里面条件相同的部分记录产生一个记录集,union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 . JOIN用于按照ON条件联接两 ...

  7. left join 、right join 和inner join之间的区别

    SQL的left join .right join 和inner join之间的区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录  right join(右联接) ...

  8. Java线程中yield与join方法的区别

    长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...

  9. left join,right join,inner join,full join之间的区别

    参考 https://www.cnblogs.com/assasion/p/7768931.html https://blog.csdn.net/rongbo_j/article/details/46 ...

随机推荐

  1. AWR不能自动生成快照

    尝试手工生成,报错sysaux表空间满. BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT (); END; 检查DBA_HIST_SNAPSHOT和dba ...

  2. Saliency Detection via Graph-Based Manifold Ranking

    Saliency Detection via Graph-Based Manifold Ranking https://www.yuque.com/lart/papers 本文不是按照之前的论文那样, ...

  3. vue+elementUI表格列显示隐藏遇到bug

    在最近的项目中,有需求要做到根据字段显示列,原来以为简单的v-if可以解决. 在开发的过程中遇到问题, <el-table ref="multipleTable" :data ...

  4. js调用后台方法

    一种方法是使用ajax调用$.ajax({type: "POST",//传输方式url: "",//action路径data: "",//传 ...

  5. (python)编程小练习

    1.将一串字符串反向输出,如将"abcd"变成“dcba” str1="abcd" print str1[::-1] 2.判断是否为回文——判断用户输入的字符串 ...

  6. javafx安装

    可在官网http://efxclipse.bestsolution.at/ 下载 其中http://efxclipse.bestsolution.at/install.html#all-in-one ...

  7. flume接收http请求,并将数据写到kafka

    flume接收http请求,并将数据写到kafka,spark消费kafka的数据.是数据采集的经典框架. 直接上flume的配置: source : http channel : file sink ...

  8. linux 解压 压缩 常见命令

    压缩命令: .tar tar -cvf 文件名称.tar 文件或者文件夹 .tar.gz tar -zcvf 文件名称.tar.gz 文件或者文件夹 .tar.xz tar -Jcf 文件名称.tar ...

  9. Python连接oracle数据库的基本操作

    1,创建数据库连接connect和关闭数据库连接close 1.1 创建数据库连接的三种方式: 方法一:用户名.密码和监听分开写 import cx_Oracle db=cx_Oracle.conne ...

  10. [swarthmore cs75] Compiler 4 – Diamondback

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第6次大作业. 函数声明 增加函数声明.函数调用的抽象语法:在转换成anf之前还要检查函数声明和 ...