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 self,cls,decorator的理解
Jul 13 Python
python使用range函数计算一组数和的方法
May 07 Python
python中enumerate函数用法实例分析
May 20 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
Python使用functools实现注解同步方法
Feb 06 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
Python socket模块ftp传输文件过程解析
Nov 05 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
如何基于windows实现python定时爬虫
May 01 Python
基于opencv的selenium滑动验证码的实现
Jul 24 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
解析目标检测之IoU
Jun 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连接Oracle数据库
2006/10/09 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
javascript排序函数实现数字排序
2015/06/26 Javascript
使用jQuery UI库开发Web界面的简单入门指引
2016/04/22 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
JSONP跨域请求
2017/03/02 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
vue2.0结合Element-ui实战案例
2019/03/06 Javascript
VUE 实现复制内容到剪贴板的两种方法
2019/04/24 Javascript
Javascript 类型转换、封闭函数及常见内置对象操作示例
2019/11/15 Javascript
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
Webpack5正式发布,有哪些新特性
2020/10/12 Javascript
分享给Python新手们的几道简单练习题
2017/09/21 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
使用python实现ANN
2017/12/20 Python
Python下载网络小说实例代码
2018/02/03 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
pytorch forward两个参数实例
2020/01/17 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
干部考察材料范文
2014/12/24 职场文书
文明旅游倡议书
2015/04/28 职场文书
会议室管理制度范本
2015/08/06 职场文书