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处理csv数据的方法
Mar 11 Python
Python的string模块中的Template类字符串模板用法
Jun 27 Python
Python中的字符串替换操作示例
Jun 27 Python
Python字典简介以及用法详解
Nov 15 Python
python3.6使用pickle序列化class的方法
Oct 22 Python
python3利用Socket实现通信的方法示例
May 06 Python
用Python获取摄像头并实时控制人脸的实现示例
Jul 11 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
Jan 25 Python
使用python自动追踪你的快递(物流推送邮箱)
Mar 17 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
May 20 Python
Python实现打包成库供别的模块调用
Jul 13 Python
opencv实现图像平移效果
Mar 24 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 时间转换Unix时间戳代码
2010/01/22 PHP
利用php绘制饼状图的实现代码
2013/06/07 PHP
destoon之一键登录设置
2014/06/21 PHP
PHP数组与对象之间使用递归实现转换的方法
2015/06/24 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
PHP Header用于页面跳转时的几个注意事项
2016/10/21 PHP
PHP实现对xml进行简单的增删改查(CRUD)操作示例
2017/05/19 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
node.js中的fs.createWriteStream方法使用说明
2014/12/17 Javascript
Angularjs中如何使用filterFilter函数过滤
2016/02/06 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
jquery表单提交带错误信息提示效果
2017/03/09 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
深入浅析JavaScript中的in关键字和for-in循环
2020/04/20 Javascript
Python Socket编程详细介绍
2017/03/23 Python
python enumerate函数的使用方法总结
2017/11/15 Python
python3 破解 geetest(极验)的滑块验证码功能
2018/02/24 Python
python numpy 一维数组转变为多维数组的实例
2018/07/02 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Python 继承,重写,super()调用父类方法操作示例
2019/09/29 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
财务会计专业毕业生自荐信
2013/10/02 职场文书
给水排水工程专业毕业生推荐信
2013/10/28 职场文书
护士毕业生自荐信
2014/02/07 职场文书
2016个人廉洁自律承诺书
2016/03/25 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL
ant design charts 获取后端接口数据展示
2022/05/25 Javascript