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 相关文章推荐
pytyon 带有重复的全排列
Aug 13 Python
python定时器使用示例分享
Feb 16 Python
python实现红包裂变算法
Feb 16 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
Python与Java间Socket通信实例代码
Mar 06 Python
Python实现的绘制三维双螺旋线图形功能示例
Jun 23 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
对Python 语音识别框架详解
Dec 24 Python
Pyqt5 基本界面组件之inputDialog的使用
Jun 25 Python
使用Python制作一个打字训练小工具
Oct 01 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
python opencv 检测移动物体并截图保存实例
Mar 10 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
PHP递归实现层级树状展开
2016/04/01 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
PHP pthreads v3在centos7平台下的安装与配置操作方法
2020/02/21 PHP
js setattribute批量设置css样式
2009/11/26 Javascript
基于AngularJS实现页面滚动到底自动加载数据的功能
2015/10/16 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
VUE引入第三方js包及调用方法讲解
2019/03/01 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
js实现上传图片并显示图片名称
2019/12/18 Javascript
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Django自定义插件实现网站登录验证码功能
2017/04/19 Python
django限制匿名用户访问及重定向的方法实例
2018/02/07 Python
分析python请求数据
2018/08/19 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
abstract是什么意思
2012/02/12 面试题
国际贸易系求职信
2014/08/09 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
毕业论文致谢信
2015/05/14 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技