python一些性能分析的技巧
當我們開始精通編程語言時,我們不僅希望實現(xiàn)最終目標,而且希望使我們的程序高效。
在這個教程中,我們將學習一些Ipython的命令,這些命令可以幫助我們對Python代碼進行時間分析。
注意,在本教程中,我建議使用Anaconda。
1.分析一行代碼
要檢查一行python代碼的執(zhí)行時間,請使用 %timeit 。下面是一個簡單的例子來了解它的工作原理:
#### magics命令%timeit的簡單用法%timeit [num for num in range(20)]#### 輸出1.08 µs ± 43 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
主要注意事項:
在要分析的代碼行之前使用%timeit 它返回代碼運行的平均值和標準偏差。在上面的示例中,執(zhí)行了7次,每次執(zhí)行對該代碼循環(huán)100萬次(默認行為)。這需要平均1.08微秒和43納秒的標準偏差。 在調用magic命令時,可以自定義運行和循環(huán)的數(shù)量。示例如下:#### 在%timeit magic命令中自定義運行和循環(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)
使用命令選項-r和-n,分別表示執(zhí)行次數(shù)和循環(huán)次數(shù),我們將時間配置文件操作定制為執(zhí)行5次和循環(huán)100次。
2.分析多行代碼
本節(jié)向前邁進了一步,并解釋了如何分析完整的代碼塊。通過對%timeit magic命令進行一個小的修改,將單百分比(%)替換為雙百分比(%%),就可以分析一個完整的代碼塊。以下為示例演示,供參考:
#### 使用timeblock%%代碼分析%%timeit -r5 -n1000for 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í)行時間為10.5微秒。請注意,命令選項-r和-n分別用于控制執(zhí)行次數(shù)和循環(huán)次數(shù)。
3.代碼塊中的每一行代碼進行時間分析
到目前為止,我們只在分析一行代碼或代碼塊時查看摘要統(tǒng)計信息。如果我們想評估代碼塊中每一行代碼的性能呢?使用 Line_profiler 。
Line_profiler包可用于對任何函數(shù)執(zhí)行逐行分析。要使用line_profiler軟件包,請執(zhí)行以下步驟:
安裝— Line_profiler 包可以通過簡單的調用pip或conda Install來安裝。如果使用的是針對Python的anaconda發(fā)行版,建議使用conda安裝
#### 安裝line_profiler軟件包conda install line_profiler
加載擴展—一旦安裝,你可以使用IPython來加載line_profiler:
#### 加載line_profiler的Ipython擴展%load_ext line_profiler
時間分析函數(shù)—加載后,使用以下語法對任何預定義函數(shù)進行時間分析
%lprun -f function_name_only function_call_with_arguments
語法細節(jié):
對line_profiler的調用以關鍵字%lprun開始,后跟命令選項-f 命令選項之后是函數(shù)名,然后是函數(shù)調用在本練習中,我們將定義一個接受高度(以米為單位)和重量(以磅為單位)列表的函數(shù),并將其分別轉換為厘米和千克。
#### 定義函數(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 sFile: <ipython-input-13-41e195af43a9>Function: conversion at line 2Line # 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]
輸出詳細信息:
以14.6微秒為單位(參考第一行輸出)
生成的表有6列:
第1列(行#)—代碼的行號(請注意,第#1行是故意從輸出中省略的,因為它只是函數(shù)定義語句) 第2列(命中)—調用該行的次數(shù) 第3列(時間)—在代碼行上花費的時間單位數(shù)(每個時間單位為14.6微秒) 第4列(每次命中平均時間)—第3列除以第2列 第5列(%Time)—在所花費的總時間中,花在特定代碼行上的時間百分比是多少 第6列(內(nèi)容)—代碼行的內(nèi)容你可以清楚地注意到,高度從米到厘米的轉換幾乎占了總時間的72%。
結束語
利用每一行代碼的執(zhí)行時間,我們可以部署策略來提高代碼的效率。在接下來的3個教程中,我們將分享一些最佳實踐來幫助你提高代碼的效率。
我希望這篇教程能提供幫助,你能學到一些新東西。
以上就是python一些性能分析的技巧的詳細內(nèi)容,更多關于python 性能分析的資料請關注好吧啦網(wǎng)其它相關文章!
相關文章:
1. ASP 信息提示函數(shù)并作返回或者轉向2. python matplotlib:plt.scatter() 大小和顏色參數(shù)詳解3. vue使用webSocket更新實時天氣的方法4. 淺談python出錯時traceback的解讀5. Python importlib動態(tài)導入模塊實現(xiàn)代碼6. android studio 打包自動生成版本號與日期,apk輸入路徑詳解7. 利用promise及參數(shù)解構封裝ajax請求的方法8. 在Android中使用WebSocket實現(xiàn)消息通信的方法詳解9. Nginx+php配置文件及原理解析10. JSP數(shù)據(jù)交互實現(xiàn)過程解析
