字符串join函数for循环+区别:
原因是这样的,字符串是不可变对象,当用操作符+连接字符串的时候,每执行一次+都会申请一块新的内存,然后复制上一个+操作的结果和本次操作的右操作符到这块内存空间,因此用+连接字符串的时候会涉及好几次内存申请和复制。而join在连接字符串的时候,会先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去,这是为什么join的性能优于+的原因。所以在连接字符串数组的时候,我们应考虑优先使用join。
---------------------
作者:shs867
来源:CSDN
原文:https://blog.csdn.net/shs867/article/details/79924712
版权声明:本文为博主原创文章,转载请附上博文链接!
测试环境:windows10+python3.7
测试代码1
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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()
测试结果1
1. 因为省去了生成中间对象,join效率远远高于那种for循环中有临时变量的代码
2. =比+=用时要多
测试代码2
因为怀疑是for自己写的临时变量影响效率,遂写成一连串字符串直接相加
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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)
测试结果2
可发现join比字符串直接相加要慢,似乎网上常见的说法有问题,个人猜测,错误之处请指出
参考