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

参考

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

字符串join函数跟+号测试的更多相关文章

  1. 说明split()与join()函数的区别?

    前者是切割成数组的形式,后者是将数组转换成字符串join函数获取一批字符串,然后用分隔符字符串将它们连接起来,从而返回一个字符串.Split函数获取一个字符串,然后再分隔符处将其断开,从而返回一批字符 ...

  2. python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用

    在抓取网络数据的时候,有时会用正则对结构化的数据进行提取,比如 href="https://www.1234.com"等.python的re模块的findall()函数会返回一个所 ...

  3. Python中字符串操作函数string.split('str1')和string.join(ls)

    Python中的字符串操作函数split 和 join能够实现字符串和列表之间的简单转换, 使用 .split()可以将字符串中特定部分以多个字符的形式,存储成列表 def split(self, * ...

  4. PHP中常用的字符串格式化函数总结

    注意:在PHP中提供的字符串函数处理的字符串,大部分都不是在原字符串上修改,而是返回一个格式化后的新字符串. 一.取出空格和字符串填补函数 空格也是一个有效的字符,在字符串中也会占据一个位置.用户在表 ...

  5. php字符串处理函数常见问题

    PHP 的字符串处理功能非常强大,主要包括: 字符串输出 echo():输出一个或多个字符串 print():输出一个字符串 printf():输出格式化字符串 字符串去除 trim():去除字符串 ...

  6. PHP学习系列(1)——字符串处理函数(4)

    16.hebrevc() 函数把希伯来文本从右至左的流转换为左至右的流.它也会把新行 (\n) 转换为 <br />.只有 224 至 251 之间的 ASCII 字符,以及标点符号受到影 ...

  7. Postgresql 字符串操作函数

    样例测试: update property set memorial_no = btrim(memorial_no, ' ') where memorial_no like ' %' 或:update ...

  8. Postgresql数据库的一些字符串操作函数

    今天做项目遇到客户反映了一个麻烦的事情,有一些数据存在,但就是在程序中搜索不出来,后来分析,发现问题为数据前面有几个空白字符,后来用SQL查询了一下,发现八九个数据表中,数千万条数据中有将近三百万条数 ...

  9. js 字符串操作函数有哪些

    js 字符串操作函数有哪些 一.总结 一句话总结:js字符串函数都是字符串对象的方法,是通过调用字符串方法的方式调用,和java,php里面不一样. 1.字符串替换函数怎么用? 这里的正则表示是加双引 ...

随机推荐

  1. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  2. eclipse 开发web 项目,使用gradle 需要安装的插件

    1.Buildship Gradle 扩展 eclipse IDE 以支持使用 Gradle 构建软件.此解决方案由 Eclipse 基金会提供 2.EGradle Editor (主要用来编写gra ...

  3. Collections算法类

    Collections类定义了一系列用于操作集合的静态方法. 常用方法: 1.sort():排序(默认是升序排列,降序实现方法) 如果ArrayList的泛型指定为String int等类型,可以通过 ...

  4. c# 串口SerialPort

    创建SerialPortFun类 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...

  5. Web项目中的 /

    如果 /  出现在路径的前面: web.xml中:http://loclalhost:8080/项目名称/      在项目的根路径下面 jsp中: http://localhost:8080/    ...

  6. C#之事件与eventArgs

    static void Main(string[] args)         {             MyText myText = new MyText();             myTe ...

  7. laravel 多条件查询

    select * from homework where (id between 1 and 10 or id between 50 and 70) and complete = 1 and (tit ...

  8. 你不知道的CSS

    white-space: pre-line;//P标签自动换行

  9. gRPC 如何使用python表示多维数组

    在使用gRPC作为远程调用框架时,如何使用python来表示多维数组呢?gRPC中定义proto文件时,有一个参数是repeated,用来表示重复的数据类型,使用这个参数可以表示list类型.如下,我 ...

  10. 调用webservice帮助类

    using System;using System.CodeDom;using System.CodeDom.Compiler;using System.Collections.Generic;usi ...