西南民族大学学报(自然科学版)
Journal of Southwest Minzu University ( Natural Science Edition)
2019年1月第45卷第1期
Jan. 2019Vol. 45 No. 1
doi :10. 11920/xnmdzk. 2019.01.011
动态语言字符串连接方法的性能研究
郑明秀
(西南民族大学计算机科学与技术学院,四川成都610041)
摘要:Python 语言是一个强大的面向对象程序设计语言,具有可扩展性,可嵌入性,以及丰富的计算生态等特点,目
前已广泛应用于各个领域.但其高度的抽象却带来巨大的性能代价.如何进行高性能编程是亟待深入研究的方向.字 符串操作是数据处理中最常见的,针对字符串拼接操作的三种方式进行实验对比,这次实验研究
对于使用Python 作为 大数据处理工具的代码优化具有一定的指导意义.
关键词:字符串运算符+ ;join()方法;推导式;Python ;大数据
中图分类号:TP39 文献标志码:A 文章编号:2095^271(2019)01-0072-04
Performance study of string join method in dynamic language
ZHENG Ming-xiu
(School of Computer Science and Technology , Southwest Minzu University , Chengdu 610041 , P. R. C.)
Abstract : Python is a powerful object-oriented programming language. It has the characteristics of scalability , embeddedness , and rich computing ecology. It has been widely used in various fields. However, its high abstraction brings huge performance
costs. How to perform high performance programming is the direction to be further studied. String manipulation is the most com
mon method in data processing. In this paper , three methods of string splicing are compared. This experimental study has a cer
tain guiding significance for code optimization using Python as a large data processing tool.
Key words :operator + ;join( ) ;derivation ;Python ;big data.
Python 是一个有条理且强大的面向对象的程序
设计语言⑴.目前进入TIOBE 世界编程语言排行榜
前三名⑵.Python 正变得越来越普遍,它已经是各高 校对于需要编程的所有科目的第一选择,并且现在也
得到了工业世界的青睐•它的可扩展性,可嵌入性,丰 富的库等特点,使其广泛应用于系统维护、图形处理、
数据分析,文本处理,数据库编程,网络编程,机器学 习,人工智能等方面3〕.
Python 具有高度的表现力且容易上手,其核心运 行于一组非常优化的指令上,编程人员无需考虑底层
计算元素,而专注于算法实现,这使得高度抽象化的 软件在高度复杂化的硬件平台上较低的执行效
率期口,其巨大的性能代价包括:Python 虚拟机抽象 让矢量操作不能直接可用,还影响了保存L1/L2缓存
中相关数据的优化,最本质的因素是其动态类型以及
并不是一门编译性的语言〔切.其性能代价已成为业界 的最大诟病,但是它能快速实现原型,若能根据操作对 象做适当的代码优化,则能大幅提高代码运行效率.
Python 应用于各领域,其中有大量的信息处理, 信息处理中对字符串的处理占很高的比例,本文针对
字符串操作方法性能作实验对比研究.
1 Python 内存管理机制
Python 是一种动态类型语言,采用基于值的内存
收稿日期:2018-10-08
作者简介:郑明秀(1968 -),女,汉族,四川大竹人,副教授,研究方向:软件工程和数据挖掘 基金项
目:国家社科基金重大招标项目(17ZDA160)
第1期郑明秀:动态语言字符串连接方法的性能研究73
管理机制,变量中并不直接存放值,而是存放值的引用[13'141.在程序执行过程中,变量名被绑定到不同的值,赋值运算符只是创建变量名称和值之间的关联.每个值都有自己的类型,但是变量名称是没有类型的,执行过程中,一个变量名可以绑定任意类型的值聞.
Python有两种共存的内存管理机制:引用计数和垃圾回收.引用计数是一种非常高效的内存管理手段,当一个Python对象被引用时其引用计数增加1,当其不再被某变量引用时则计数减1,当引用计数等于0时对象被垃圾回收器删除.
字符串是Python中不可变序列,不能直接对字符串对象进行元素的增删改操作•因此对字符串的增删改操作都将产生一个新的字符串,即在内存中重新分配内存空间并进行复制操作.
2研究方法
2.1基本假定
实际场景中对字符串的操作需求纷繁复杂,可能包含字符串的索引、切片、拼接、复制、搜索、统计、修改等等,为便于获取实验对比数据:
a)本实验仅研究字符串的拼接效率;
b)为简化实验,拼接对象假定为一个简单的短字符串;
c)实验研究三种字符串拼接方式:+运算符,join ()函数以及推导式应用
2.2研究内容
实验中需要处理时间,time库是python提供的处理时间的标准库,它提供系统级精确计时器的计时功能,可以用来分析程序的性能•本实验中仅需要使用其time()函数获得程序运行起始时刻和终止时刻,从而取得程序的运行时间.
使用如下代码计算连接运算符+的运算时间:
def AddOperator(n):#拼接运算符"+”
start=time.time()
s=n"
for i in range(n):
s=s+"abc"
end二time.time()
return end-start
join()函数拼接字符串时需要生成列表,采用append()函数生成列表后使用join()连接字符串的代码如下:
def JoinFuction(n):#join()方法
start=time.time()
ls=[]
for i in range(n):
Is.append("abc")
s="H.join(Is)
end=time.time()
return end-start
采用列表推导式生成列表,再使用join()函数连接字符串的代码如下:
def DerivationAndJoin(n):#推导式生成列表后使用join()方法
start=time.time()
Is=["abc"for x in range(n)]
s二”".join(Is)
end二time.time()
return end-start
为了保证实验结果的稳定性,避免因计算机内随机因素导致的测试误差偏移过大,代码中的n值取1000000〜100000000.
N二1000000
print(••)<12i(<15|i<15||门5「.format(”数据规模”,”+运算符”,H join()方法”,”推导式+join ()“
for n in range(N,10*N+1,N):
timel=AddOperator((n))
time2二JoinFuction(n)
time3=DerivationAndJoin(n)
print(n|:12d|j:>15.4f||:>15.4f}):> 15.4f|".format(n,time1,time2,time3))
3实验方法
3.1实验环境
本实验在如下约束条件下进行:
•编程工具:Pychami;
•解释器版本:python3.7.0
•测试数据
74西南民族大学学报(自然科学版)第45卷
丿数据属性:字符串;
y数据规模:100000()-10000000;
/数据组数=10*10组,即10个不同规模的数据组,每个不同规模的数据各自1()组;
•实验环境
y OS:windows8.1中文版;
丿处理器:Intel(R)Core™i74710MQ@ 2.50GHz 2.50GHz
y RAM:8G
丿系统类型:64位操作系统,基于x64的处理器
3.2补充说明
实验是由代码运行的起始时刻点与终止时刻之差表示代码运行的时间,系统中其它程序对CPU的占用将
字符串常量mine的字符个数是对实验结果产生较大的影响,因此实验开始前尽量关闭其它应用软件,降低计算机内部随机因素对实验结果可靠性的影响•另外需要多次实验釆集实验数据样本,以提高实验结果的可信度•此研究对字符串连接进行了10次百万次级到千万次级运行时间的数据采集.
4实验分析
4.1基础数据分析
为避免实验受随机因素影响,上述实验共进行10次,下面从三个角度展示实验数据.表1是其中一次一百万次级到一千万次级字符串连接,三种连接方式的运行时间数据样本•数据显示连接运算符“+”需要的运行时间明显高于另外两种连接方式.
表2是各种规模数据10次实验运行时间均值.表2于表1数据对照,可以看出同等数据规模的单次实验数据与均值之间差距不大•表3是数据规模500万次级的10次实验数据,可以看出10次同等数据规模的三种不同连接方式的自身的运行时间相近•因此可以认为本次实验数据样本是可信的.
表210次实验数据均值
Table2Mean value of1()times experiment 数据规模连接符+join()方法推导式+join()
10000000.57940.11690.0682
2000000 2.17020.25670.1404
3000000 4.93550.36170.2142
40000009.04770.49120.2985
500000014.29740.59950.3585
600000020.49400.74260.4469
700000028.06700.86860.5118
800000036.84080.97930.5731
900000046.5716 1.09760.6440
1000000057.8502 1.21830.7197
表3数据规模5000000时运行时间
Table3Running time of data size is5millions
数据规模连接符+join()方法推导式+join()
500000014.45730.62370.3498
500000014.27760.59140.3620
500000014.34860.59740.3608
500000014.17190.59140.3512
500()00014.81770.61080.3526
500(X)0014.18780.59390.3509
500000()14.16560.58660.3654
500(X)0014.06970.58580.3500
500000014.31940.59280.3819
500000014.15800.62100.3600
4.2可视化分析
表1三种连接方式的运行时间
Table1Running time of three connection inodes
数据规模连接符+join()方法推导式+join() 10000000.57090.12430.0735 ******* 2.19870.25520.1400 3000000 4.93290.36560.2034 40000009.12050.53050.2912 500000014.34860.59740.3608 600000020.50240.71580.4288 70000002&07170.87800.5013 800000036.7590 1.01000.5992 900000046.5824 1.06030.6390 1000000057.7796 1.19330.7183
图1和图2是对表2数据的可视化展示,可以看出连接运算符+随着数据规模的增长,其运行时间增长趋势是非常明显的,其图形显示不是线性关系,而是某种指数关系.由于连接运算符+所用运行时间远远大于另两种连接方式,因此图1中看不出join方法和推导式&join方法连接方式的趋势,这两种方式的运行时间对于连接运算符而言微乎其微.
图2是join()方法和推导式&join()方法运行时间的对比图,图形显示这两种连接方式使用推导式产生字符串列表后进行字符串连接的运行时间明显更少,两种连接方式运行时间均伴随数据规模的增长呈
第1期郑明秀:动态语言字符串连接方法的性能研究75线性趋势.
70.0000
60.0000—♦—连接运算符+•join()方法-♦—推导式+join()
1.4000
( S
)匡盂9
越50.0000
40.0000
30.0000
20.0000
(
S
5
Z
一&
®
10.0000
0.0000
-joint)方法•推导式+join()
1.2000
1.0000
0.8000
0.6000
0.4000
0.2000
0.0000
10000003000000
数据规模10000003000000500000070000009000000500000070000009000000数据规模
图1三种连接方式运行时间曲线图
Fig.1Curves of running time of three connections
5结论
本实验通过对三种不同连接方式的百万次级到千万次级数据规模的代码多次运行时间采样,从采样样本观察分析可知连接运算符“+”的代码运行效率极低,随着数据规模的增长,其运行时间呈指数级增长;jom()方法连接字符串的运行时间远远优于使用“+”运算符连接字符串,对于大规模数据情况,join ()方法的时间较“+”运算符,其耗时微乎其微.当推导式配合join()方法后,运行时间再次明显下降.
鉴于Python在如今大数据时代的流行趋势,这次实验研究对于使用Python作为大数据处理工具的代码优化具有一定的指导意义.
参考文献
[1]百度百科.Python[EB/0L].(2018-8-20)[2018-9-25]hltps://
baike.baidu/item/Python/407313?fr=aladdin#reference-]7,-21087-wrap.
[2]TIOBE.TIOBE Index for September2018[EB/OL[.(2018-9-20)
[2018-9-25;https://www.tiobe/tiobe-index/.
[3]余本国•基于Python的大数据分析基础及实战[M].北京:中国水
利水电出版社,2018.
:4]李学龙,龚海刚大数据系统综述[J].中国科学:信息科学,2015
图2Join方法与推导式&join方法对比图
Eig.2Comparison between join))and derived&join()
(I):548.
[5]任磊,杜一,马帅,等.大数据可视分析综述[J]•软件学报,2014
(9):27-54.
[6]刘智慧,张泉灵.大数据技术研究综述[J].浙江大学学报(工学
版),2014(06):6-21.
f7j JASON J JUNG.Computational Collective Intelligence with Big Data: Challenges and Opportunities[J].Future Generation Computer Sys-lems,2017,66:87-88.
[8]吴廷鹏,张星,刘玉宇.基于即时编译器辅助的并行垃圾收集器
[J]•计算机匸程,2009(10):92-94.
[9]李[比胜•基于运行时的程序执行模型研究[D].合肥:中国科学技
术大学,2010.
[10]张颖,赖勇浩•编写高质竝代码一一改善Python程序的91个建议
[MJ.北京:机械匸业出版社,2014.
[11]TJ0CONNOR.Python绝技——运用Python成为顶级黑客[M].
崔孝晨,武晓音,等译•北京:电子工业出版社,2016.
[⑵MICHA GORELICK,LAN OZSVALD.Python高性能编程[M].胡世杰,徐旭彬,译•北京:人民邮电出版社,2017:8-11.
[13]董付国.Python可以这样学[M].北京:清华大学出版社,2017:53-
58.
[⑷网易云课堂.Python数据分析实战[EB/0L],(2018-7-15)[2018-9-25.https://i/course/introduction.htm?courseld= 1103001.
[15]DAVID M BEAZLEY.Python参考手册:第4版[M].谢俊,等,译.
北京:人民邮电出版社,2018=1-5.
(责任编辑:张FB,付强,李建忠,罗敏;英文编辑:
周序林)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论