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套接字流重定向实例汇总
Mar 03 Python
Python中字符串的处理技巧分享
Sep 17 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
基于Python实现扑克牌面试题
Dec 11 Python
python实现交并比IOU教程
Apr 16 Python
python 比较字典value的最大值的几种方法
Apr 17 Python
Python异常处理机制结构实例解析
Jul 23 Python
Python自动发送和收取邮件的方法
Aug 12 Python
如何基于pandas读取csv后合并两个股票
Sep 25 Python
python 第三方库paramiko的常用方式
Feb 20 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
Python进程间的通信之语法学习
Apr 11 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里8个鲜为人知的安全函数分析
2014/12/09 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
javascript数组去重3种方法的性能测试与比较
2013/03/26 Javascript
你必须知道的Javascript知识点之"this指针"的应用
2013/04/23 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
JavaScript中获取鼠标位置相关属性总结
2014/10/11 Javascript
Javascript学习笔记之相等符号与严格相等符号
2014/11/23 Javascript
js实现防止被iframe的方法
2015/07/03 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
Angular2 组件间通过@Input @Output通讯示例
2017/08/24 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
详解ESLint在Vue中的使用小结
2018/10/15 Javascript
详解webpack4.x之搭建前端开发环境
2019/03/28 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
JavaScript实现tab栏切换效果
2020/03/16 Javascript
Python设计模式之单例模式实例
2014/04/26 Python
python使用Berkeley DB数据库实例
2014/09/26 Python
Python采集代理ip并判断是否可用和定时更新的方法
2018/05/07 Python
使用tensorflow实现线性回归
2018/09/08 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
解决python 文本过滤和清理问题
2019/08/28 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
AmazeUI 网格的实现示例
2020/08/13 HTML / CSS
Sperry澳大利亚官网:源自美国帆船鞋创始品牌
2019/07/29 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
Unix里面如何在后台运行程序
2016/10/14 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
婚前协议书怎么写
2014/04/15 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
领导班子对照检查剖析材料
2014/10/13 职场文书
优秀班集体申报材料
2014/12/25 职场文书
生死牛玉儒观后感
2015/06/11 职场文书
《烈火英雄》观后感:致敬和平时代的英雄
2019/11/11 职场文书