zoukankan      html  css  js  c++  java
  • Python连接字符串用join还是+

    我们先来看一下用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的性能明显好于+。这是为什么呢?

    原因是这样的,字符串是不可变对象,当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,然后复制上一个+操作的结果和本次操作的右操作符到这块内存空间,因此用+连接字符串的时候会涉及好几次内存申请和复制。

    而join在连接字符串的时候,会先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去,这是为什么join的性能优于+的原因。

    所以在连接字符串数组的时候,我们应考虑优先使用join。

  • 相关阅读:
    洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树
    洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树
    2017年NOIP普及组复赛题解
    洛谷P3957 跳房子 题解 二分答案/DP/RMQ
    2016年NOIP普及组复赛题解
    2015年NOIP普及组复赛题解
    2014年NOIP普及组复赛题解
    洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
    2013年NOIP普及组复赛题解
    第四章 选择结构(二)
  • 原文地址:https://www.cnblogs.com/kadycui/p/10343029.html
Copyright © 2011-2022 走看看