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中各种方法的运作原理
Jun 15 Python
Python做简单的字符串匹配详解
Mar 21 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
python实现二叉查找树实例代码
Feb 08 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
Feb 13 Python
使用turtle绘制五角星、分形树
Oct 06 Python
在Python中利用pickle保存变量的实例
Dec 30 Python
Python如何实现在字符串里嵌入双引号或者单引号
Mar 02 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
May 18 Python
利用pipenv和pyenv管理多个相互独立的Python虚拟开发环境
Nov 01 Python
python中pyplot基础图标函数整理
Nov 10 Python
Python中tkinter的用户登录管理的实现
Apr 22 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
这部番真是良心,画质好到像风景区,剧情让人跟着小公会热血沸腾
2020/03/10 日漫
一个简单计数器的源代码
2006/10/09 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
2007/03/15 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
jQuery 操作option的实现代码
2011/03/03 Javascript
自己使用js/jquery写的一个定制对话框控件
2014/05/02 Javascript
javascript原型链继承用法实例分析
2015/01/28 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
javascript的列表切换【实现代码】
2016/05/03 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
javascript实现手动点赞效果
2019/04/09 Javascript
微信小程序搭建自己的Https服务器
2019/05/02 Javascript
vue实现两个区域滚动条同步滚动
2020/12/13 Vue.js
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
pandas的qcut()方法详解
2019/07/06 Python
python 实现字符串下标的输出功能
2020/02/13 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python requests上传文件实现步骤
2020/09/15 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
Melissa鞋马来西亚官方网站:MDreams马来西亚
2018/04/05 全球购物
班组长工作职责
2013/12/25 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
意向书范本
2014/07/29 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
php 文件上传至OSS及删除远程阿里云OSS文件
2021/07/04 PHP
Python图像处理库PIL详细使用说明
2022/04/06 Python