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共享引用(多个变量引用)示例代码
Dec 04 Python
python中精确输出JSON浮点数的方法
Apr 18 Python
深入理解Python中各种方法的运作原理
Jun 15 Python
Python sqlite3事务处理方法实例分析
Jun 19 Python
关于Python 3中print函数的换行详解
Aug 08 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
python 实现GUI(图形用户界面)编程详解
Jul 17 Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 Python
python 实现按对象传值
Dec 26 Python
Scrapy模拟登录赶集网的实现代码
Jul 07 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
virtualenv隔离Python环境的问题解析
Jun 21 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的宝库目录--PEAR
2006/10/09 PHP
PHP 批量更新网页内容实现代码
2010/01/05 PHP
用 Composer构建自己的 PHP 框架之构建路由
2014/10/30 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
发现的以前不知道的函数
2006/09/19 Javascript
javascript prototype 原型链
2009/03/12 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
浅谈Vue的基本应用
2016/12/27 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
利用ECharts.js画K线图的方法示例
2018/01/10 Javascript
浅谈Angular7 项目开发总结
2018/12/19 Javascript
非常实用的jQuery代码段集锦【检测浏览器、滚动、复制、淡入淡出等】
2019/08/08 jQuery
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
python进阶教程之文本文件的读取和写入
2014/08/29 Python
WINDOWS 同时安装 python2 python3 后 pip 错误的解决方法
2017/03/16 Python
python 获取当天凌晨零点的时间戳方法
2018/05/22 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
Python FFT合成波形的实例
2019/12/04 Python
Python的形参和实参使用方式
2019/12/24 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
三星美国官网:Samsung美国
2017/02/06 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
机电专业毕业生求职信
2014/07/01 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
新郎答谢词
2015/01/04 职场文书
介绍信格式
2015/01/30 职场文书
责任书格式
2019/04/18 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server