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抓取京东商城手机列表url实例代码
Dec 18 Python
浅析python 内置字符串处理函数的使用方法
Jun 11 Python
在Python程序中操作文件之isatty()方法的使用教程
May 24 Python
Python设计模式之门面模式简单示例
Jan 09 Python
Python实现判断给定列表是否有重复元素的方法
Apr 11 Python
python实现音乐下载的统计
Jun 20 Python
对python中词典的values值的修改或新增KEY详解
Jan 20 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
python应用Axes3D绘图(批量梯度下降算法)
Mar 25 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
Python NumPy灰度图像的压缩原理讲解
Aug 04 Python
Python用any()函数检查字符串中的字母以及如何使用all()函数
Apr 14 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&&mysql)六
2006/10/09 PHP
php缓存技术介绍
2006/11/25 PHP
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
php+xml编程之xpath的应用实例
2015/01/24 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
js自带函数备忘 数组
2006/12/29 Javascript
jQuery 浮动广告实现代码
2008/12/25 Javascript
多浏览器兼容的获取元素和鼠标的位置的js代码
2009/12/15 Javascript
js控制页面控件隐藏显示的两种方法介绍
2013/10/09 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
js键盘事件的keyCode
2014/07/29 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
2016/01/19 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
Angular2平滑升级到Angular4的步骤详解
2017/03/29 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
python实现隐马尔科夫模型HMM
2018/03/25 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
2018/05/29 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
Python 日期区间处理 (本周本月上周上月...)
2019/08/08 Python
python获取全国城市pm2.5、臭氧等空气质量过程解析
2019/10/12 Python
大唐面试试题(CPU,UNIX等等)
2012/01/11 面试题
就业推荐表自我鉴定范文
2014/03/21 职场文书
项目合作协议书
2014/04/16 职场文书
卖车协议书
2014/04/21 职场文书
代办委托书怎么写
2014/08/01 职场文书
2014年招生工作总结
2014/11/26 职场文书
2016秋季运动会前导词
2015/11/25 职场文书
python实现学员管理系统(面向对象版)
2022/06/05 Python