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 相关文章推荐
pyv8学习python和javascript变量进行交互
Dec 04 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
Python正则表达式匹配中文用法示例
Jan 17 Python
python实现人脸识别代码
Nov 08 Python
Python使用numpy实现BP神经网络
Mar 10 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
May 16 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
Numpy中对向量、矩阵的使用详解
Oct 29 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
python实现人机五子棋
Mar 25 Python
Python 开发工具通过 agent 代理使用的方法
Sep 27 Python
Python实现双向链表基本操作
May 25 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
杏林同学录(二)
2006/10/09 PHP
创建配置文件 用PHP写出自己的BLOG系统 2
2010/04/12 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
关于PHP session 存储方式的详细介绍
2013/06/25 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
jQuery不使用插件及swf实现无刷新文件上传
2014/12/08 Javascript
浅析Node.js中使用依赖注入的相关问题及解决方法
2015/06/24 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
nodejs创建简易web服务器与文件读写的实例
2017/09/07 NodeJs
用Electron写个带界面的nodejs爬虫的实现方法
2019/01/29 NodeJs
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
2020/02/06 Javascript
JavaScript简单编程实例学习
2020/02/14 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
Python三级菜单的实例
2017/09/13 Python
在Python 中实现图片加框和加字的方法
2019/01/26 Python
Python logging设置和logger解析
2019/08/28 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
python学生信息管理系统实现代码
2019/12/17 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
Java如何获得ResultSet的总行数
2016/09/03 面试题
高二英语教学反思
2014/01/19 职场文书
中学劳技课教师的自我评价
2014/02/05 职场文书
家长会主持词
2014/03/26 职场文书
高中英语演讲稿范文
2014/04/24 职场文书
大型会议策划方案
2014/05/17 职场文书
幼儿园健康教育方案
2014/06/14 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
工作简报怎么写
2015/07/21 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
同事离别感言
2015/08/04 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL