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网络爬虫采集联想词示例
Feb 11 Python
python通过装饰器检查函数参数数据类型的方法
Mar 13 Python
10款最好的Web开发的 Python 框架
Mar 18 Python
Python实现简单拆分PDF文件的方法
Jul 30 Python
发布你的Python模块详解
Sep 15 Python
Python中datetime模块参考手册
Jan 13 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Django Rest framework三种分页方式详解
Jul 26 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 Python
Python简易开发之制作计算器
Apr 28 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 readfile()修改文件上传大小设置
2017/08/11 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
Javascript 中文字符串处理额外注意事项
2009/11/15 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
JS通过相同的name进行表格求和代码
2013/08/18 Javascript
javascript使用百度地图api和html5特性获取浏览器位置
2014/01/10 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
js判断变量初始化的三种形式及推荐用的形式
2014/07/22 Javascript
Javascript 拖拽雏形中的一些问题(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
js命名空间写法示例
2015/12/18 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
基于jQuery封装的分页组件
2017/06/26 jQuery
详解redis在nodejs中的应用
2018/05/02 NodeJs
vue better scroll 无法滚动的解决方法
2018/06/07 Javascript
微信小程序实现登录注册tab切换效果
2020/12/29 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
Python通过len函数返回对象长度
2020/10/22 Python
详解Python中如何将数据存储为json格式的文件
2020/11/18 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
学期自我鉴定
2013/11/04 职场文书
物流仓储计划书
2014/01/10 职场文书
保护环境标语
2014/06/09 职场文书
国际商贸专业自荐信
2014/06/09 职场文书
阅兵口号
2014/06/19 职场文书
文员求职信
2014/07/15 职场文书
单位未婚证明范本
2014/11/25 职场文书
营销策划分析:怎么策划才能更好销量产品?
2019/09/04 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL