字符串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()
测试结果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)
测试结果2
可发现join比字符串直接相加要慢,似乎网上常见的说法有问题,个人猜测,错误之处请指出

参考
字符串join函数跟+号测试的更多相关文章
- 说明split()与join()函数的区别?
前者是切割成数组的形式,后者是将数组转换成字符串join函数获取一批字符串,然后用分隔符字符串将它们连接起来,从而返回一个字符串.Split函数获取一个字符串,然后再分隔符处将其断开,从而返回一批字符 ...
- python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
在抓取网络数据的时候,有时会用正则对结构化的数据进行提取,比如 href="https://www.1234.com"等.python的re模块的findall()函数会返回一个所 ...
- Python中字符串操作函数string.split('str1')和string.join(ls)
Python中的字符串操作函数split 和 join能够实现字符串和列表之间的简单转换, 使用 .split()可以将字符串中特定部分以多个字符的形式,存储成列表 def split(self, * ...
- PHP中常用的字符串格式化函数总结
注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表 ...
- php字符串处理函数常见问题
PHP 的字符串处理功能非常强大,主要包括: 字符串输出 echo():输出一个或多个字符串 print():输出一个字符串 printf():输出格式化字符串 字符串去除 trim():去除字符串 ...
- PHP学习系列(1)——字符串处理函数(4)
16.hebrevc() 函数把希伯来文本从右至左的流转换为左至右的流.它也会把新行 (\n) 转换为 <br />.只有 224 至 251 之间的 ASCII 字符,以及标点符号受到影 ...
- Postgresql 字符串操作函数
样例测试: update property set memorial_no = btrim(memorial_no, ' ') where memorial_no like ' %' 或:update ...
- Postgresql数据库的一些字符串操作函数
今天做项目遇到客户反映了一个麻烦的事情,有一些数据存在,但就是在程序中搜索不出来,后来分析,发现问题为数据前面有几个空白字符,后来用SQL查询了一下,发现八九个数据表中,数千万条数据中有将近三百万条数 ...
- js 字符串操作函数有哪些
js 字符串操作函数有哪些 一.总结 一句话总结:js字符串函数都是字符串对象的方法,是通过调用字符串方法的方式调用,和java,php里面不一样. 1.字符串替换函数怎么用? 这里的正则表示是加双引 ...
随机推荐
- AngularJS学习之旅—AngularJS 模块(十五)
一.AngularJS 模块 模块定义了一个应用程序. 模块是应用程序中不同部分的容器. 模块是应用控制器的容器. 控制器通常属于一个模块. 1.创建模块 通过 AngularJS 的 angular ...
- Python基础之函数和模块
函数的基本使用 函数的定义:把具有独立功能的代码块组织成一个小模块,在需要的时候调用.或者说,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数的使用:1.定义函数:2.调用函数 ...
- Help is needed for Dexter UVA - 11384(二分)
本来抱着wa一发的心态写写,没想到过了. 算是一种二分吧. 也就是说,减数取太大和太小都不好,怎样是最好的呢?当然是,每次减去一个数之后新形成的序列和前面的序一样是最好的 这样的话,本来想写个二分,但 ...
- redis对sorted_set进行的相关操作
redis对sorted_set(有序集合)类型操作的相关命令以及如何在python使用这些命令 redis对sorted_set(有序集合)类型操作的命令: 命令 语法 概述 返回值 Redis Z ...
- selenium中隐式等待和显示等待的区别
Selenium显示等待和隐式等待的区别1.selenium的显示等待原理:显示等待,就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没找到,那么久 ...
- c++ _pFirstBlock == pHead
今天写程序时碰到了这个异常,导致调试的程序卡死.在网上找了很久答案,都没解决.大致判定是对象被多次析构,但又确认程序逻辑没有问题. 后来参考了 http://www.cnblogs.com/qinta ...
- js 简单弹框toast
新建toast.js文件 function Toast(msg,duration){ duration=isNaN(duration)?3000:duration; var m = document. ...
- Spring 完成自动注入(autowire)
目录 两个测试类 普通方式手动注入 普通方式注入的缺点 自动注入的介绍 配置自动注入的方式 配置全局自动注入 局部单独配置 利用注解实现自动注入 两个测试类 package cn.ganlixin.p ...
- [转帖]Windows 上面IE的历史
微软向Chrome举手投降 这么多代IE你都用过吗 2019年04月20日 18:48 4030 次阅读 稿源:太平洋电脑网 2 条评论 这个清明假节,很多人过得波澜不惊,然而一个曾被万千网民挂在口中 ...
- [2019BUAA人工智能实战_陈泽寅]第1次个人作业
我们的征程是星辰和大海 一.索引 项目 内容 这个作业属于哪个课程 BUAA人工智能实战 这个作业的要求在哪里 here 我在这个课程的目标是 理论实践相结合,提升自己coding能力 这个作业在哪个 ...