美文网首页
Python Cookbook:各种字符串拼接方法的效率究竟如何

Python Cookbook:各种字符串拼接方法的效率究竟如何

作者: 碎冰op | 来源:发表于2017-07-26 23:29 被阅读34次

    很多人都吹Python一定要看Python Cookbook掌握一些小技巧,然而里面部分代码似乎根本没有实际测试过。
    举个例子
    这里说道,+=比生成器慢,真的有敲过代码测试过时间吗???

    可以把以下代码直接黏贴到在线代码测试查看运行时间

    以下是测试代码

    import timeit
    from time import clock
    
    l = ['ACME', 50, 91.1]
    a = clock()
    s = ''
    for i in l:
        s += i
    b = clock()
    s = ''.join(str(i) for i in l)
    c = clock()
    s = []
    for i in l:
        s.append(i)
    s = ''.join(s)
    d = clock()
    
    print((b - a)*1000000)#0.26
    print((c - b)*1000000)#0.43
    print((d - c)*1000000)#0.17
    

    二十次测试下来,第三种方法,list的append再join是最快的,第二种是最慢的才对。

    要让生成器方式比循环+=快,必须是列表本身存在大量元素,导致+=反复申请内存的情况,比如

    import timeit
    from time import clock
    
    l = ['pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab']
    a = clock()
    s = ''
    for i in l:
        s += i
    b = clock()
    s = ''.join(str(i) for i in l)
    c = clock()
    s = []
    for i in l:
        s.append(i)
    s = ''.join(s)
    d = clock()
    
    print((b - a)*1000000)#83.8
    print((c - b)*100000)#63.1
    print((d - c)*100000)#43.1
    

    即使如此还是第三种最快
    当然,最快的其实是

    s = ''.join([i for i in l])
    

    列表生成式比生成器的劣势是可能消耗大量内存。

    那么看cookbook本页面中紧接的下一段,

    import timeit
    from time import clock
    
    a = clock()
    print('a' + ':' + 'b' + ':' + 'c')
    b = clock()
    print(':'.join(['a', 'b', 'c']))
    c = clock()
    print('a', 'b', 'c', sep=':')
    d = clock()
    
    print((b - a)*100000)#1.60
    print((c - b)*100000)#0.42
    print((d - c)*100000)#0.74
    

    二十次测试后,第三种所谓better的性能,比第二种又慢了1倍。

    那么如果大量内存的情况下,这里还会又能稍微对那么一点吗?

    import timeit
    from time import clock
    
    a = clock()
    print('pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab')
    b = clock()
    print(':'.join(['pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab',]))
    c = clock()
    print('pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab', sep=':')
    d = clock()
    
    print((b - a)*100000)#101.7
    print((c - b)*100000)#32.1
    print((d - c)*100000)#400.9
    

    第三种现在是最慢的,耗时是+的4倍。简直就是放屁........

    尽信书不如无书。

    相关文章

      网友评论

          本文标题:Python Cookbook:各种字符串拼接方法的效率究竟如何

          本文链接:https://www.haomeiwen.com/subject/vbjokxtx.html