字符串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.字符串替换函数怎么用? 这里的正则表示是加双引 ...
随机推荐
- matplotlib正弦和余弦图
代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 16:37:47 2018 @author: zhen &qu ...
- yum 安装 python-pip 失败解决方法
这个包在EPEL源里,要添加EPEL源才可以.然后按博客里说的方法添加,执行以下命令: sudo rpm -ivh epel-release* 第一种方式:由于epel在禁用列表里需要另外加参数yum ...
- ARMV8体系结构简介
armv8 1.前言 本文的主要内容来源于ARMV8白皮书v5,对ARMV8做一个概述.包含如下的内容: 首先从背景谈起,讲述ARM的发展历程: 之后介绍ARMV8体系结构的基本特征: 介绍A64指令 ...
- SharpZipLib压缩解压的使用
项目中使用 Velocity 将模板和生成的动态内容(HTML.XML等)合并保存到redis数据库中,考虑到压缩的文件容量会比较小,方便传输而且存储所使用的空间也会比较小,所以要压缩一下,读取的时候 ...
- 分享两个细致、全面讲解Vue和React源码的链接
Vue: 1.http://hcysun.me/vue-design/ 2.https://ustbhuangyi.github.io/vue-analysis/(带视频,但收费) React: 3. ...
- MySQL存储引擎简单介绍
MySQL使用的是插件式存储引擎. 主要包含存储引擎有:MyISAM,Innodb,NDB Cluster,Maria.Falcon,Memory,Archive.Merge.Federated. 当 ...
- “百度杯”CTF比赛 十月场EXEC
前面比较常规吧看源代码-看到vim 然后就是 .index.php.swp 然后就是 这个文件的恢复,用linux下vim -r index.php.swp 就可以看到不是乱码的文件了 然后就是审核 ...
- CSS中字距,词距,首行缩进,字体大小,排版相关问题的探讨
先说明下,这是在谷歌浏览器下字体显示等问题做个研究,火狐下有点差异,不过火狐占有率低,而且显示的没有谷歌那么合理,不管它先.IE卡的要死,半死不活,也懒得深入研究这些细节,字体排版上不是强迫症,差别也 ...
- pstree:command not found
centos7默认并没有安装pstree,所以会有pstree:command not found yum -y install psmisc
- 从JS的深拷贝与浅拷贝到jq的$.extend()方法
一.堆内存与栈内存 堆和栈都是内存中划分出来的用来存储的区域,栈为自动分配的内存空间,它由系统自动释放,堆为动态分配的内存,大小不定也不会自动释放. 二.js基本数据类型与引用类型的不同 基本数据类型 ...