• 字符串join函数跟+号测试


    字符串join函数for循环+区别:

    原因是这样的,字符串是不可变对象,当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,然后复制上一个+操作的结果和本次操作的右操作符到这块内存空间,因此用+连接字符串的时候会涉及好几次内存申请和复制。而join在连接字符串的时候,会先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去,这是为什么join的性能优于+的原因。所以在连接字符串数组的时候,我们应考虑优先使用join。
    ---------------------
    作者:shs867
    来源:CSDN
    原文:https://blog.csdn.net/shs867/article/details/79924712
    版权声明:本文为博主原创文章,转载请附上博文链接!

    测试环境:windows10+python3.7

    测试代码1

    from time import time
    import functools
    BASE_STR = 'basebase'
    STRS = ['str_'+str(i) for i in range(10**6)]
    
    def excute_time(func):
        @functools.wraps(func)
        def inner(*args, **kw):
            start_time = time()
            res = func(*args, **kw)
            end_time = time()
            print('{} 执行耗时{:.3f}秒'.format(func.__name__, end_time-start_time))
            return res
        return inner
    
    @excute_time
    def str_merge_by_add():
        '''测试字符串相加'''
        result = ''
        for item in STRS:
            result += item
    
    @excute_time
    def str_merge_by_add2():
        '''测试字符串相加'''
        result = ''
        for item in STRS:
            result = result + item
    
    @excute_time
    def str_merge_by_join():
        '''测试join函数'''
        result = ''
        result = ''.join(STRS)
    
    if __name__ == '__main__':
        for i in range(3):
            str_merge_by_add()
            str_merge_by_add2()
            str_merge_by_join()
    View Code

    测试结果1

    1. 因为省去了生成中间对象,join效率远远高于那种for循环中有临时变量的代码

    2. =比+=用时要多

    测试代码2

    因为怀疑是for自己写的临时变量影响效率,遂写成一连串字符串直接相加 

    from time import time
    import functools
    TOTAL = 10**6
    
    # def excute_time(fun_name=None):
    #     '''打印执行时间,如果传入fun_name,则输出语句显示传入名,否则显示被装饰函数的名字'''
    #     def wrapper(func):
    #         @functools.wraps(func)
    #         def inner(*args, **kw):
    #             print(args,kw)
    #             start_time = time()
    #             res = func(*args, **kw)
    #             end_time = time()
    #             print('{} 执行耗时{:.3f}秒'.format(fun_name or func.__name__, end_time-start_time))
    #             return res
    #         return inner
    #     return wrapper
    
    def excute_time(func):
        '''打印执行时间,显示传入的函数的名称'''
        @functools.wraps(func)
        def inner(*args, **kw):
            start_time = time()
            res = func(*args, **kw)
            end_time = time()
            func_name = func.__name__
            if type(args[0]) is type(excute_time):
                func_name = args[0].__name__
            print('{} 执行耗时{:.3f}秒'.format(func_name, end_time-start_time))
            return res
        return inner
    
    @excute_time
    def run(func, n=TOTAL):
        '''循环运行TOTAL次'''
        while n>0:
            func()
            n = n-1
    
    def str_add():
        '''字符串直接加'''
        result = 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab'
    
    def str_add2():
        '''字符串直接加'''
        temp = ['ab', 'ab',  'ab',  'ab',  'ab',  'ab',  'ab',  'ab',  'ab']
        result = 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab' + 'ab'
    
    def str_join():
        temp = ['ab', 'ab',  'ab',  'ab',  'ab',  'ab',  'ab',  'ab',  'ab']
        result = ''.join(temp)
    
    if __name__ == '__main__':
        for i in range(3):
            run(str_add)
            run(str_add2)
            run(str_join)
    View Code

    测试结果2

    可发现join比字符串直接相加要慢,似乎网上常见的说法有问题,个人猜测,错误之处请指出

    参考

    Python中连接字符串用join还是+

  • 相关阅读:
    作业16
    递归函数
    三元表达式与生成式
    迭代器与生成器
    作业15
    装饰器
    作业14
    string的入门与进阶
    修理牧场(优先队列)
    旅游规划
  • 原文地址:https://www.cnblogs.com/lurenjia1994/p/10604588.html
Copyright © 2020-2023  润新知