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 相关文章推荐
使用url_helper简化Python中Django框架的url配置教程
May 30 Python
浅析python递归函数和河内塔问题
Apr 18 Python
Python Flask-web表单使用详解
Nov 18 Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 Python
使用NumPy和pandas对CSV文件进行写操作的实例
Jun 14 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
python二元表达式用法
Dec 04 Python
Python实现中值滤波去噪方式
Dec 18 Python
Python API len函数操作过程解析
Mar 05 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
python中JWT用户认证的实现
May 18 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
js中eval详解
2012/03/30 Javascript
IE的fireEvent方法概述及应用
2013/02/22 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
JavaScript设计模式初探
2016/01/07 Javascript
分享网页检测摇一摇实例代码
2016/01/14 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
JS实现n秒后自动跳转的两种方法
2020/11/30 Javascript
微信小程序 template模板详解及实例代码
2017/03/09 Javascript
EasyUI的DataGrid绑定Json数据源的示例代码
2017/12/16 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
vue 组件间的通信之子组件向父组件传值的方式
2020/07/29 Javascript
Vue如何跨组件传递Slot的实现
2020/12/14 Vue.js
js实现鼠标切换图片(无定时器)
2021/01/27 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
python获得图片base64编码示例
2014/01/16 Python
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python用for循环实现九九乘法表
2018/05/31 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Django csrf 两种方法设置form的实例
2019/02/03 Python
django框架模板语言使用方法详解
2019/07/18 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述
2013/03/30 面试题
高中毕业自我鉴定
2013/12/16 职场文书
城管综合整治方案
2014/05/01 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
分析并发编程之LongAdder原理
2021/06/29 Java/Android