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中使用HTMLParser解析HTML的教程
Apr 29 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
Python实现字符串匹配算法代码示例
Dec 05 Python
Python之csv文件从MySQL数据库导入导出的方法
Jun 21 Python
解决pycharm安装后代码区不能编辑的问题
Oct 28 Python
Python在图片中插入大量文字并且自动换行
Jan 02 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
Pytorch 实现权重初始化
Dec 31 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
matplotlib图例legend语法及设置的方法
Jul 28 Python
python中if嵌套命令实例讲解
Feb 25 Python
python入门之算法学习
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
XAMPP安装与使用方法详细解析
2013/11/27 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
js对象的比较
2011/02/26 Javascript
js 链式延迟执行DOME
2012/01/04 Javascript
javascript:history.go()和History.back()的区别及应用
2012/11/25 Javascript
jquery如何扑捉回车键触发的事件
2014/04/24 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
2019/08/27 Javascript
Python3.6正式版新特性预览
2016/12/15 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
Python写一个基于MD5的文件监听程序
2019/03/11 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
西班牙创意礼品和小工具网上商店:Curiosite
2016/07/26 全球购物
美国床垫和床上用品公司:Nest Bedding
2017/06/12 全球购物
有机童装:Toby Tiger
2018/05/23 全球购物
运动会800米加油稿
2014/02/22 职场文书
教学督导岗位职责
2015/04/10 职场文书
Nginx本地目录映射实现代码实例
2021/03/31 Servers
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android
MySQL数据库查询之多表查询总结
2022/08/05 MySQL