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用zip函数同时遍历多个迭代器示例详解
Nov 14 Python
Python 正则表达式的高级用法
Dec 04 Python
python的random模块及加权随机算法的python实现方法
Jan 04 Python
python根据list重命名文件夹里的所有文件实例
Oct 25 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
Oct 09 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
Jan 19 Python
解决pycharm同一目录下无法import其他文件
Feb 12 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
python3实现飞机大战
Nov 29 Python
Window10上Tensorflow的安装(CPU和GPU版本)
Dec 15 Python
python之PySide2安装使用及QT Designer UI设计案例教程
Jul 26 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游戏编程25个脚本代码
2011/02/08 PHP
php实现简单的上传进度条
2015/11/17 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
使用jQuery和PHP实现类似360功能开关效果
2014/02/12 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
针对BootStrap中tabs控件的美化和完善(推荐)
2016/07/06 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
理解Python中的With语句
2016/03/18 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
Python 中urls.py:URL dispatcher(路由配置文件)详解
2017/03/24 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
python实现石头剪刀布小游戏
2021/01/20 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
Docker部署Python爬虫项目的方法步骤
2020/01/19 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
什么是python的必选参数
2020/06/21 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
如何通过python检查文件是否被占用
2020/12/18 Python
美国顶级奢侈茶:Mighty Leaf Tea(美泰茶)
2016/11/26 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
个人求职简历的自我评价范文
2013/10/09 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年见习期工作总结
2014/12/12 职场文书
入党积极分子个人总结
2015/03/02 职场文书
公司会议开幕词
2016/03/03 职场文书
Java 超详细讲解数据结构中的堆的应用
2022/04/02 Java/Android