亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Python性能分析

Python性能分析

來源:千鋒教育
發布人:xqq
時間: 2023-11-07 19:23:11 1699356191

python標準庫提供兩個代碼性能分析相關的模塊,即timeit和cProfile/profile。前者更適合測試簡短的代碼片段,后者則可分析代碼片段乃至整體模塊中各個函數的調用次數、運行耗時等信息。

cProfile是profile的C版本,開銷更小?;赾Profile模塊,可方便地評估程序性能瓶頸(bottleneck),借以發現程序中值得優化的短板。

根據粒度不同,可將cProfile使用場景分為三類。

1.1分析單條語句

importcProfile,pstats,re,cStringIO

cProfile.run('re.compile("foo|bar")','prfRes')#將cProfile的結果寫入prfRes文件

p=pstats.Stats('prfRes')#pstats讀取cProfile輸出結果

#strip_dirs()剝除模塊名的無關路徑(如C:\Python27\lib\)

#sort_stats('cumtime')或sort_stats('cumulative')按照cumtime對打印項排序

#print_stats(n)打印輸出前10行統計項(不指定n則打印所有項)

p.strip_dirs().sort_stats('cumtime').print_stats(5)

pstats模塊可用多種方式對cProfile性能分析結果進行排序并輸出。運行結果如下:

TueMay2413:56:072016prfRes

195functioncalls(190primitivecalls)in0.001seconds

Orderedby:cumulativetime

Listreducedfrom33to5duetorestriction<5>

ncallstottimepercallcumtimepercallfilename:lineno(function)

10.0000.0000.0010.001:1()

10.0000.0000.0010.001re.py:192(compile)

10.0000.0000.0010.001re.py:230(_compile)

10.0000.0000.0010.001sre_compile.py:567(compile)

10.0000.0000.0000.000sre_compile.py:552(_code)

其中,tottime表示某函數的總計運行時間(不含該函數內調用的子函數運行時間),cumtime表示某函數及其調用的子函數的累積運行時間。

1.2分析代碼片段

pr=cProfile.Profile()

pr.enable()#以下為待分析代碼段

regMatch=re.match('^([^/]*)/(/|\*)+(.*)$','//*suspicious')

printregMatch.groups()

pr.disable()#以上為待分析代碼段

s=cStringIO.StringIO()

pstats.Stats(pr,stream=s).sort_stats('cumulative').print_stats(10)

prints.getvalue()

運行結果如下:

('','*','suspicious')

536functioncalls(512primitivecalls)in0.011seconds

Orderedby:cumulativetime

Listreducedfrom78to10duetorestriction<10>

ncallstottimepercallcumtimepercallfilename:lineno(function)

20.0000.0000.0090.005C:\Python27\lib\idlelib\PyShell.py:1343(write)

20.0000.0000.0090.005C:\Python27\lib\idlelib\rpc.py:591(__call__)

20.0000.0000.0090.005C:\Python27\lib\idlelib\rpc.py:208(remotecall)

20.0000.0000.0090.004C:\Python27\lib\idlelib\rpc.py:238(asyncreturn)

20.0000.0000.0090.004C:\Python27\lib\idlelib\rpc.py:279(getresponse)

20.0000.0000.0090.004C:\Python27\lib\idlelib\rpc.py:295(_getresponse)

20.0000.0000.0090.004C:\Python27\lib\threading.py:309(wait)

80.0090.0010.0090.001{method'acquire'of'thread.lock'objects}

10.0000.0000.0020.002C:\Python27\lib\re.py:138(match)

10.0000.0000.0020.002C:\Python27\lib\re.py:230(_compile)

1.3分析整個模塊

使用命令行,調用cProfile腳本分析其他腳本文件。命令格式為:

python-mcProfile[-ooutput_file][-ssort_order]myscript.py

注意,-o和-s選項不可同時使用。

以C代碼統計工具為例,運行如下命令:

E:\PyTest>python-mcProfile-stottimeCLineCounter.pysource-d-b>out.txt

截取out.txt文件部分內容如下:

250316245433620.25xtm_mgr.c

1408729374932093169380.26

762068functioncalls(762004primitivecalls)in2.967seconds

Orderedby:internaltime

ncallstottimepercallcumtimepercallfilename:lineno(function)

820.9850.0122.8690.035CLineCounter.py:11(CalcLines)

1176400.6120.0001.3150.000re.py:138(match)

1176500.3810.0000.3810.000{method'match'of'_sre.SRE_Pattern'objects}

1176550.3190.0000.3240.000re.py:230(_compile)

1380500.1980.0000.1980.000{method'isspace'of'str'objects}

1058230.1650.0000.1650.000{method'strip'of'str'objects}

123156/1231410.1540.0000.1540.000{len}

378870.0550.0000.0550.000{method'group'of'_sre.SRE_Match'objects}

820.0410.0000.0410.000{method'readlines'of'file'objects}

820.0160.0000.0160.000{open}

10.0040.0042.9502.950CLineCounter.py:154(CountDir)

由tottime可見,此處的性能瓶頸在于CalcLines()函數和其中的正則表達式處理。而isspace()和strip()方法及len()函數因調用次數較多,總的耗時也頗為可觀。

作為對比,以下給出一種未使用正則表達式的統計實現:

defCalcLines(line,isBlockComment):

lineType,lineLen=0,len(line)

line=line+'\n'#添加一個字符防止iChar+1時越界

iChar,isLineComment=0,False

whileiChar

#行結束符(Windows:\r\n;Mac:\r;Unix:\n)

ifline[iChar]=='\r'orline[iChar]=='\n':

break

elifline[iChar]==''orline[iChar]=='\t':#空白字符

iChar+=1;continue

elifline[iChar]=='/'andline[iChar+1]=='/':#行注釋

isLineComment=True

lineType|=2;iChar+=1#跳過'/'

elifline[iChar]=='/'andline[iChar+1]=='*':#塊注釋開始符

isBlockComment[0]=True

lineType|=2;iChar+=1

elifline[iChar]=='*'andline[iChar+1]=='/':#塊注釋結束符

isBlockComment[0]=False

lineType|=2;iChar+=1

else:

ifisLineCommentorisBlockComment[0]:

lineType|=2

else:

lineType|=1

iChar+=1

returnlineType#Bitmap:0空行,1代碼,2注釋,3代碼和注釋

在CalcLines()函數中。參數line為當前文件行字符串,參數isBlockComment指示當前行是否位于塊注釋內。該函數直接分析句法,而非模式匹配。注意,行結束符可能因操作系統而異,因此應區分CR(回車)和LF(換行)符。此外,也可在讀取文件時采用"rU"(即通用換行模式),該模式會將行結束符\r\n和\r替換為\n。

基于新的CalcLines()函數,CountFileLines()函數需作如下修改:

defCountFileLines(filePath,isRawReport=True,isShortName=False):

fileExt=os.path.splitext(filePath)

iffileExt[1]!='.c'andfileExt[1]!='.h':

return

isBlockComment=[False]#或定義為全局變量,以保存上次值

lineCountInfo=[0]*4#[代碼總行數,代碼行數,注釋行數,空白行數]

withopen(filePath,'r')asfile:

forlineinfile:

lineType=CalcLines(line,isBlockComment)

lineCountInfo[0]+=1

iflineType==0:lineCountInfo[3]+=1

eliflineType==1:lineCountInfo[1]+=1

eliflineType==2:lineCountInfo[2]+=1

eliflineType==3:lineCountInfo[1]+=1;lineCountInfo[2]+=1

else:

assertFalse,'UnexpectedlineType:%d(0~3)!'%lineType

ifisRawReport:

globalrawCountInfo

rawCountInfo[:-1]=[x+yforx,yinzip(rawCountInfo[:-1],lineCountInfo)]

rawCountInfo[-1]+=1

elifisShortName:

detailCountInfo.append([os.path.basename(filePath),lineCountInfo])

else:

detailCountInfo.append([filePath,lineCountInfo])

將這種統計實現命名為BCLineCounter.py。通過cProfile命令分析其性能,截取out.txt文件部分內容如下:

250316245433620.25xtm_mgr.c

1408729373632106169380.26

286013functioncalls(285979primitivecalls)in3.926seconds

Orderedby:internaltime

ncallstottimepercallcumtimepercallfilename:lineno(function)

1408723.3340.0003.4750.000BCLineCounter.py:15(CalcLines)

830.4090.0053.9030.047BCLineCounter.py:45(CountFileLines)

141593/1415850.1420.0000.1420.000{len}

820.0140.0000.0140.000{open}

10.0040.0040.0040.004collections.py:1()

4160.0030.0000.0040.000ntpath.py:96(splitdrive)

840.0020.0000.0020.000{nt._isdir}

10.0020.0020.0070.007argparse.py:62()

10.0020.0023.9263.926BCLineCounter.py:6()

可見,性能并不如CLineCounter.py。因此,使用標準庫(如re)提供的函數或方法,不失為明智的選擇。

此外,對比BCLineCounter.py和CLineCounter.py的詳細行數報告可知,兩者的統計結果存在細微差異(正負誤差不超過5行)。差異主要體現在有效代碼行和純注釋行統計上,因為總行數和空白行數通常不會出現統計誤差。那么,哪種實現更可靠呢?

作者首先想到挑選存在統計差異的文件,人工或半人工地刪除純注釋行和空白行,從而得到精確的有效代碼行數。之所以不編寫腳本自動刪除上述類型的文件行,是因為作者對于注釋行的解析已經存在誤差,無法作為基準參考。

C語言預處理器可剔除代碼注釋,但同時也會剔除#if0...#endif之類的無效語句,不滿足要求。于是,作者用UEStudio打開源文件,進入【搜索(Search)】|【替換(Replace)】頁,選擇Unix正則表達式引擎,用^\s*/\*.*\*/匹配單行注釋(/*abc*/)并替換為空字符,用^\s*//.*$匹配單行注釋(//abc)并替換為空字符。然后,查找并手工刪除跨行注釋及其他未匹配到的單行注釋。最后,選擇UltraEdit正則表達式引擎,用%[^t]++^p匹配空行并替換為空字符,即可刪除所有空行。注意,UEStudio幫助中提供的正則表達式^p$一次只能刪除一個空行。

按上述方式處理兩個大型文件后,初步發現BCLineCounter.py關于有效代碼行數的統計是正確的。然而,這種半人工處理方式太過低效,因此作者想到讓兩個腳本處理相同的文件,并輸出有效代碼行或純注釋行的內容,將其通過AraxisMerge對比。該工具會高亮差異行,且人工檢查很容易鑒別正誤。此處,作者假定對于給定文件的給定類型行數,BCLineCounter.py和CLineCounter.py必有一者統計正確(可作基準)。當然,也有可能兩者均有誤差。因此,若求保險,也可同時輸出類型和行內容,再行對比。

綜合檢查結果發現,BCLineCounter.py較CLineCounter.py更為健壯。這是因為,模式匹配需要處理的場景繁多,極易疏漏。例如,CLineCounter.py無法正確處理下面的代碼片段:

voidtest(){

/*/multiline,

comment*/

inta=1/2;//comment

//*Assignavalue

}

讀者若有興趣,可修改和調試CLineCounter.py里的正則表達式,使該腳本高效而健壯。

以上內容為大家介紹了Python性能分析,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。

tags: python培訓
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
粉嫩一区二区三区性色AV| 草草影院CCYY国产日本欧美| YOUJIZZ中国少妇| 大伊香蕉精品视频在线天堂| 国产美足白丝榨精在线观看sm| 娇妻宾馆被三根粗大的夹击| 免费AV网站在线观看| 日韩精品人成在线播放| 性欧美ⅩXXXX极品少妇小说| 一面膜上边一面膜下边韩国| 拔萝卜视频免费观看高清下载| 国产精品扒开腿做爽爽爽| 九九视频免费精品视频| 女儿国免费观看完整版在线| 少妇高潮呻吟在线观看| 亚洲大胸美女被操喷水| 97电影九七电影理论片| 国产成人亚洲精品无码MP4 | 一日本道A高清免费播放| JIZZJIZZ日本高潮喷水| 国产裸体美女永久免费无遮挡| 久久精品人人做人人爽| 日本大乳高潮视频在线观看| 亚洲AV无码无在线观看红杏| …日韩人妻无码精品一专区 | 黑人精品一区二区三区| 欧美A级情欲片在线观看免费| 他揉捏她两乳不停呻吟人妻| 亚洲桃色AV无码| 草草浮力地址线路①屁屁影院| 国产又爽又黄无码无遮挡在线观看 | 无码国内精品久久综合88| 夜夜高潮天天爽欧美| 成人麻豆精品激情视频在线观看| 狠狠色噜噜狠狠狠狠888奇禾| 欧美日韩精品一区二区三区不卡 | 18禁亲胸揉胸膜下刺激免费网站| 国产成人一区二区三区视频免费| 久久青青草原精品国产| 色综合色狠狠天天综合网| 亚洲中文字幕无码中字| 丰满少妇人妻无码专区| 老师趴讲台屁股撅起来作文 | 一边捏奶头一边高潮视频| 第九理论午夜电影院| 久久久久亚洲AV成人片丁香| 少妇无码AV无码专区线| 孕交VIDEOSGRATIS乌| 国产精品99久久久久久宅男小说| 蜜臀AⅤ永久无码精品| 无码夜色一区二区三区| JAPANESETUBE日本护| 精品国内自产拍在线观看视频| 日产精品一卡2卡三卡4卡乱码| 亚洲国产一区二区三区波多野结衣| 波多野结衣AV一区二区全免费观看| 精品日产A一卡2卡三卡4卡乱| 日韩人妻中文字幕| 中国极品少妇XXXXX1314| 国产亚洲精品精品国产亚洲综合| 人妻少妇波多野结衣黑人| 亚洲一线产区二线产区区别在 | 挽起裙子迈开腿坐下去的图片高清| 1000部又爽又黄无遮挡的视频 | 丁香色婷婷国产精品视频| 老外免费CSGO交易网站有哪些 | 国产亚洲AV综合人人澡精品| 人与畜禽CORPORATION| 一区二区三区在线 | 欧| 国产小视频A在线观看| 日韩精品一区二区三区乱码79| 在线观看日本亚洲一区| 狠狠躁夜夜躁人人爽天天BL| 熟妇高潮一区二区精品de| A级精品国产片在线观看| 久久精品人妻一区二区三区av | 国产精品自在拍首页视频8| 啪啪无码人妻丰满熟妇| 永久免费观看国产裸体美女 | 边做饭边被躁欧美三级| 邻居少妇张开双腿让我爽一夜| 亚洲VA综合VA国产产VA中| 国产成人无码一二三区视频| 人妻插B视频一区二区三区| 一下子就弄进去岳的身体| 狠狠综合久久狠狠88亚洲| 铜铜铜铜铜铜铜铜好大好深色| XXXAV久久久久久久久久久| 乱肉怀孕又粗又大| 亚洲熟妇AV一区二区三区| 国产精品亚洲专区无码蜜芽| 色狠狠AV一区二区三区| JIZZJIZZJIZZ亚洲热| 麻花传媒MV在线播放高清MBA| 亚洲精品TV久久久久久久久| 国产日产欧美一区二区蜜桃| 私密按摩高潮熟女啪啪 | 一区三区四区产品乱码| 久久99精品久久久久久水蜜桃| 性开放按摩AV大片| 国产成人精品人人做人人爽| 日韩AV高清无码| WWWXXX国产| 欧美性性性性性色大片免费的| 最新欧美精品一区二区三区| 久久久久人妻精品一区三寸| 亚洲欧美日韩中文字幕一区二区三| 国产一区二区三区美女| 午夜DJ在线观看免费完整版社区 | 久久久久亚洲AV成人片乱码| 亚洲色成人www在线观看| 精品人妻AV无码一区二区三区| 亚洲AV一二三又爽又色又色| 国产午夜激无码AV毛片| 无码少妇一区二区浪潮免费| 国产国拍亚洲精品MV在线观看| 他的粗大把她捣出白沫| 国产AV国片精品一区二区| 熟女俱乐部 五十路 六十路| 丰满的人妻HD高清日本| 少妇VIDES裸体BBWWHD| 国产AⅤ激情无码久久| 山东中年夫妇大白天露脸自拍| 成人性色生活片免费看爆迷你 | 草莓丝瓜芭乐鸭脖奶茶搭配食物| 人人妻人人澡人人爽精品日本| А√中文在线资源库| 人与动物PPT免费模板| 不什么不什么的成语| 色婷婷五月综合亚洲影院| 丰满少妇奶水一区二区三区| 天堂8在线新版官网| 国产极品美女高潮无套APP| 无遮挡粉嫩小泬久久久久久久| 国产美女高潮流白浆视频| 亚洲AV无码成人精品区在线欢看 | 欧美96在线 | 欧| 宝贝你夹得太紧了我都要断了| 日韩人妻中文无码一区二区| 国产成人毛片在线视频| 性欧美VIDEOFREE高清潮| 精品国产黑色丝袜高跟鞋 | 久久精品国产亚洲无删除| 在办公室被C到呻吟的动态图| 女被啪到深处喷水GIF动态视频 | 日本又黄又爽又无遮挡的视频| 成年无码AV片在线狼人| 熟女少妇丰满一区二区| 国产亚洲成AV片在线观看蜜桃| 亚洲精品国自产拍在线观看| 久久无码无码久久综合综合| 18禁亲胸揉胸膜下刺激免费网站| 人妻JapanXXXX精品HD| 国产成人国拍亚洲精品| 亚洲AV福利院在线观看| 久久久久久精品免费免费R| 7777788888管家婆中特| 日本乱偷人妻中文字幕在线| 国产成人精品亚洲一区| 亚洲妇女水蜜桃AV网网站| 两根硕大一起挤进小紧H共妻| AAA少妇高潮大片免费看| 色综合久久婷婷88| 黑人又大又粗又长欧美网站| 伊人久久大香线蕉在观看| 人妻AV鲁丝一区二区三区蜜臀| 国产成人亚洲综合网站小说| 亚洲国产一区二区三区在线观看| 毛很浓密超多黑毛的少妇| 成人免费无遮挡无码黄漫视频| 无码熟妇人妻AV在线C0930| 久久高清超碰AV热热久久| 99久久无码一区人妻A黑| 天美传媒MV免费观看软件特色| 狠狠躁夜夜躁人人躁婷婷| 中文字幕人成无码人妻综合社区| 日韩AV一区在线观看| 果冻传媒AⅤ毛片无码蜜桃| 中文成人无码精品久久久不卡 | 亚洲精品舔Av一| 欧美ZC0O人与善交| 国产精品久久久久久无码| 亚洲中文字幕无码久久综合网| 强被迫伦姧惨叫VIDEO| 国产午夜成人无码免费看不卡| 在线麻豆精东9制片厂AV影现网 | 多毛丰满日本熟妇| 亚洲人成电影网站色MP4| 欧洲北美性爱逼逼视频图片| 国产美女被遭强高潮网站免费| 在线观看4480私人影视| 色狠狠色噜噜AV天堂一区| 精品无人区麻豆乱码1区2区新区 | 艳妇乳肉豪妇荡乳ⅩXXOO| 人妻丰满熟妇AⅤ无码无码区免费| 国产日韩精品一区二区三区在线观| 在线精品亚洲一区二区绿巨人| 熟妇人妻精品一区二区三区颏| 久久久久久AV无码免费网站下载| 成人影院永久免费观看网址|