python一些性能分析的技巧
當(dāng)我們開始精通編程語(yǔ)言時(shí),我們不僅希望實(shí)現(xiàn)最終目標(biāo),而且希望使我們的程序高效。
在這個(gè)教程中,我們將學(xué)習(xí)一些Ipython的命令,這些命令可以幫助我們對(duì)Python代碼進(jìn)行時(shí)間分析。
注意,在本教程中,我建議使用Anaconda。
1.分析一行代碼
要檢查一行python代碼的執(zhí)行時(shí)間,請(qǐng)使用 %timeit 。下面是一個(gè)簡(jiǎn)單的例子來了解它的工作原理:
#### magics命令%timeit的簡(jiǎn)單用法 %timeit [num for num in range(20)] #### 輸出 1.08 µs ± 43 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
主要注意事項(xiàng):
- 在要分析的代碼行之前使用%timeit
- 它返回代碼運(yùn)行的平均值和標(biāo)準(zhǔn)偏差。在上面的示例中,執(zhí)行了7次,每次執(zhí)行對(duì)該代碼循環(huán)100萬(wàn)次(默認(rèn)行為)。這需要平均1.08微秒和43納秒的標(biāo)準(zhǔn)偏差。
- 在調(diào)用magic命令時(shí),可以自定義運(yùn)行和循環(huán)的數(shù)量。示例如下:
#### 在%timeit magic命令中自定義運(yùn)行和循環(huán)數(shù) %timeit -r5 -n100 [num for num in range(20)] 1.01 µs ± 5.75 ns per loop (mean ± std. dev. of 5 runs, 100 loops each)
使用命令選項(xiàng)-r和-n,分別表示執(zhí)行次數(shù)和循環(huán)次數(shù),我們將時(shí)間配置文件操作定制為執(zhí)行5次和循環(huán)100次。
2.分析多行代碼
本節(jié)向前邁進(jìn)了一步,并解釋了如何分析完整的代碼塊。通過對(duì)%timeit magic命令進(jìn)行一個(gè)小的修改,將單百分比(%)替換為雙百分比(%%),就可以分析一個(gè)完整的代碼塊。以下為示例演示,供參考:
#### 使用timeblock%%代碼分析 %%timeit -r5 -n1000 for i in range(10): n = i**2 m = i**3 o = abs(i) #### 輸出 10.5 µs ± 226 ns per loop (mean ± std. dev. of 5 runs, 1000 loops each)
可以觀察到for循環(huán)的平均執(zhí)行時(shí)間為10.5微秒。請(qǐng)注意,命令選項(xiàng)-r和-n分別用于控制執(zhí)行次數(shù)和循環(huán)次數(shù)。
3.代碼塊中的每一行代碼進(jìn)行時(shí)間分析
到目前為止,我們只在分析一行代碼或代碼塊時(shí)查看摘要統(tǒng)計(jì)信息。如果我們想評(píng)估代碼塊中每一行代碼的性能呢?使用 Line_profiler 。
Line_profiler包可用于對(duì)任何函數(shù)執(zhí)行逐行分析。要使用line_profiler軟件包,請(qǐng)執(zhí)行以下步驟:
安裝— Line_profiler 包可以通過簡(jiǎn)單的調(diào)用pip或conda Install來安裝。如果使用的是針對(duì)Python的anaconda發(fā)行版,建議使用conda安裝
#### 安裝line_profiler軟件包 conda install line_profiler
加載擴(kuò)展—一旦安裝,你可以使用IPython來加載line_profiler:
#### 加載line_profiler的Ipython擴(kuò)展 %load_ext line_profiler
時(shí)間分析函數(shù)—加載后,使用以下語(yǔ)法對(duì)任何預(yù)定義函數(shù)進(jìn)行時(shí)間分析
%lprun -f function_name_only function_call_with_arguments
語(yǔ)法細(xì)節(jié):
- 對(duì)line_profiler的調(diào)用以關(guān)鍵字%lprun開始,后跟命令選項(xiàng)-f
- 命令選項(xiàng)之后是函數(shù)名,然后是函數(shù)調(diào)用
在本練習(xí)中,我們將定義一個(gè)接受高度(以米為單位)和重量(以磅為單位)列表的函數(shù),并將其分別轉(zhuǎn)換為厘米和千克。
#### 定義函數(shù) def conversion(ht_mtrs, wt_lbs ): ht_cms = [ht*100 for ht in ht_mtrs] wt_kgs = [wt*.4535 for wt in wt_lbs] #### 定義高度和重量列表: ht = [5,5,4,7,6] wt = [108, 120, 110, 98] #### 使用line_profiler分析函數(shù) %lprun -f conversion conversion(ht,wt) --------------------------------------------------------------- #### 輸出 Total time: 1.46e-05 s File: <ipython-input-13-41e195af43a9> Function: conversion at line 2 Line # Hits Time Per Hit % Time Line Contents ============================================================== 2 1 105.0 105.0 71.9 ht_cms = [ht*100 for ht in ht_mtrs] 3 1 41.0 41.0 28.1 wt_kgs = [wt*.4535 for wt in wt_lbs]
輸出詳細(xì)信息:
以14.6微秒為單位(參考第一行輸出)
生成的表有6列:
- 第1列(行#)—代碼的行號(hào)(請(qǐng)注意,第#1行是故意從輸出中省略的,因?yàn)樗皇呛瘮?shù)定義語(yǔ)句)
- 第2列(命中)—調(diào)用該行的次數(shù)
- 第3列(時(shí)間)—在代碼行上花費(fèi)的時(shí)間單位數(shù)(每個(gè)時(shí)間單位為14.6微秒)
- 第4列(每次命中平均時(shí)間)—第3列除以第2列
- 第5列(%Time)—在所花費(fèi)的總時(shí)間中,花在特定代碼行上的時(shí)間百分比是多少
- 第6列(內(nèi)容)—代碼行的內(nèi)容
你可以清楚地注意到,高度從米到厘米的轉(zhuǎn)換幾乎占了總時(shí)間的72%。
結(jié)束語(yǔ)
利用每一行代碼的執(zhí)行時(shí)間,我們可以部署策略來提高代碼的效率。在接下來的3個(gè)教程中,我們將分享一些最佳實(shí)踐來幫助你提高代碼的效率。
我希望這篇教程能提供幫助,你能學(xué)到一些新東西。
以上就是python一些性能分析的技巧的詳細(xì)內(nèi)容,更多關(guān)于python 性能分析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python 初始化一個(gè)定長(zhǎng)的數(shù)組實(shí)例
今天小編就為大家分享一篇python 初始化一個(gè)定長(zhǎng)的數(shù)組實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12詳解python3 + Scrapy爬蟲學(xué)習(xí)之創(chuàng)建項(xiàng)目
這篇文章主要介紹了python3 Scrapy爬蟲創(chuàng)建項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04TensorFlow的自動(dòng)求導(dǎo)原理分析
這篇文章主要介紹了TensorFlow的自動(dòng)求導(dǎo)原理分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05python獲取list下標(biāo)及其值的簡(jiǎn)單方法
下面小編就為大家?guī)硪黄猵ython獲取list下標(biāo)及其值的簡(jiǎn)單方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09Python如何基于Tesseract實(shí)現(xiàn)識(shí)別文字功能
這篇文章主要介紹了Python如何基于Tesseract實(shí)現(xiàn)識(shí)別文字功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06