字符串join函数跟+号测试

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

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

 

测试环境: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循环中有临时变量的代码windows

2. =比+=用时要多数组

 

 

测试代码2

由于怀疑是for本身写的临时变量影响效率,遂写成一连串字符串直接相加 app

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比字符串直接相加要慢,彷佛网上常见的说法有问题,我的猜想,错误之处请指出ide

 

 

参考

Python中链接字符串用join仍是+函数

相关文章
相关标签/搜索