Python字符串通过'+'和join函数拼接新字符串的性能测试比较


Posted in Python onMarch 05, 2019

有一道Python面试题, 以下代码有什么局限性,要如何修改

def strTest(num):
  s = 'Hello'
  for i in range(num):
    s += 'x'
  return s

上面的代码其实可以看出:由于变量str是不变对象,每次遍历,Python都会生成新的str对象来存储新的字符串,所以num越大,创建的str对象就越多,内存消耗约大,速度越慢,性能越差。 如果要改变上面的问题,可以变字符串拼接为join联合的方式,代码如下:

def strTest2(num):
  s = 'Hello'
  l = list(s)
  for i in range(num):
    l.append('x')
  return ''.join(l)

下面两种不同处理方式,运行速度的比较:

>>> def strTest1(num):
...   s = 'Hello'
...   for i in range(num):
...     s += 'x'
...   return s
>>> def strTest2(num):
...   s = 'Hello'
...   l = list(s)
...   for i in range(num):
...     l.append(s)
...   return ''.join(l)
>>>
>>> from timeit import timeit
# 运行10万级别数据,运行速度比对
>>> timeit("strTest1(100000)", setup="from __main__ import strTest1", number=1)
0.016680980406363233
>>> timeit("strTest2(100000)", setup="from __main__ import strTest2", number=1)
0.009688869110618725
# 运行100万级别数据,运行速度比对
>>> timeit("strTest1(1000000)", setup="from __main__ import strTest1", number=1)
0.14558920607187195
>>> timeit("strTest2(1000000)", setup="from __main__ import strTest2", number=1)
0.1335057276853462
# 运行1000万级别数据,运行速度比对
>>> timeit("strTest1(10000000)", setup="from __main__ import strTest1", number=1)
5.9497953107860475
>>> timeit("strTest2(10000000)", setup="from __main__ import strTest2", number=1)
1.3268972136649921
# 运行2000万级别数据,运行速度比对
>>> timeit("strTest1(20000000)", setup="from __main__ import strTest1", number=1)
21.661270140499056
>>> timeit("strTest2(20000000)", setup="from __main__ import strTest2", number=1)
2.6981786518920217
# 运行3000万级别数据,运行速度比对
>>> timeit("strTest1(30000000)", setup="from __main__ import strTest1", number=1)
49.858089123966295
>>> timeit("strTest2(30000000)", setup="from __main__ import strTest2", number=1)
4.285787770209481
# 运行4000万级别数据,运行速度比对
>>> timeit("strTest1(40000000)", setup="from __main__ import strTest1", number=1)
86.67876273457563
>>> timeit("strTest2(40000000)", setup="from __main__ import strTest2", number=1)
5.328653452047092
# 运行5000万级别数据,运行速度比对
>>> timeit("strTest1(50000000)", setup="from __main__ import strTest1", number=1)
130.59138063819023
>>> timeit("strTest2(50000000)", setup="from __main__ import strTest2", number=1)
6.8375931077291625
# 运行6000万级别数据,运行速度比对
>>> timeit("strTest1(60000000)", setup="from __main__ import strTest1", number=1)
188.28227241975003
>>> timeit("strTest2(60000000)", setup="from __main__ import strTest2", number=1)
8.080144489401846
# 运行7000万级别数据,运行速度比对
>>> timeit("strTest1(70000000)", setup="from __main__ import strTest1", number=1)
256.54383904350277
>>> timeit("strTest2(70000000)", setup="from __main__ import strTest2", number=1)
9.387400816458012
# 运行8000万级别数据,运行速度比对
>>> timeit("strTest1(80000000)", setup="from __main__ import strTest1", number=1)
333.7185806572388
>>> timeit("strTest2(80000000)", setup="from __main__ import strTest2", number=1)
10.946627677462857

从上面的比对数据可以看出,当数据比较小的时候,两者差别不大,当数据越大,两者性能差距就越大。从而可以看出,字符串拼接的方式一旦碰到大数据处理的时候,性能是非常慢的。 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
Python模块学习 datetime介绍
Aug 27 Python
Python3基础之条件与循环控制实例解析
Aug 13 Python
使用Python制作获取网站目录的图形化程序
May 04 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python 遍历列表里面序号和值的方法(三种)
Feb 17 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
python实现Excel文件转换为TXT文件
Apr 28 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
May 09 Python
Python求离散序列导数的示例
Jul 10 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
matlab灰度图像调整及imadjust函数的用法详解
Feb 27 Python
python中time、datetime模块的使用
Dec 14 Python
Python实现KNN(K-近邻)算法的示例代码
Mar 05 #Python
Python按钮的响应事件详解
Mar 04 #Python
Python中三元表达式的几种写法介绍
Mar 04 #Python
Python生成器的使用方法和示例代码
Mar 04 #Python
Python去除字符串前后空格的几种方法
Mar 04 #Python
python调用外部程序的实操步骤
Mar 04 #Python
Python实现的合并两个有序数组算法示例
Mar 04 #Python
You might like
判断PHP数组是否为空的代码
2011/09/08 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
php检测文件编码的方法示例
2014/04/25 PHP
PHP实现的获取文件mimes类型工具类示例
2018/04/08 PHP
docker-compose部署php项目实例详解
2019/07/30 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
javascript 二进制运算技巧解析
2012/11/27 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
JS 全屏和退出全屏详解及实例代码
2016/11/07 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
一个Js文件函数中调用另一个Js文件函数的方法演示
2017/08/14 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
python 格式化输出百分号的方法
2019/01/20 Python
Django框架安装方法图文详解
2019/11/04 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
Python实现Word文档转换Markdown的示例
2020/12/22 Python
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
架构师岗位职责
2013/11/18 职场文书
西安交大自主招生自荐信
2014/01/27 职场文书
道德模范先进事迹
2014/02/14 职场文书
《孔子游春》教学反思
2014/02/25 职场文书
锦旗标语大全
2014/06/23 职场文书
经典毕业生求职信
2014/07/12 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
刘公岛导游词
2015/02/05 职场文书
党风廉洁教育心得体会
2016/01/20 职场文书
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript