python一些效能分析的技巧
當我們開始精通程式語言時,我們不僅希望實現最終目標,而且希望使我們的程式高效。
在這個教程中,我們將學習一些Ipython的命令,這些命令可以幫助我們對Python程式碼進行時間分析。
注意,在本教程中,我建議使用Anaconda。
1.分析一行程式碼
要檢查一行python程式碼的執行時間,請使用 %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
- 它返回程式碼執行的平均值和標準偏差。在上面的示例中,執行了7次,每次執行對該程式碼迴圈100萬次(預設行為)。這需要平均1.08微秒和43納秒的標準偏差。
- 在呼叫magic命令時,可以自定義執行和迴圈的數量。示例如下:
#### 在%timeit magic命令中自定義執行和迴圈數 %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,分別表示執行次數和迴圈次數,我們將時間配置檔案操作定製為執行5次和迴圈100次。
2.分析多行程式碼
本節向前邁進了一步,並解釋瞭如何分析完整的程式碼塊。通過對%timeit magic命令進行一個小的修改,將單百分比(%)替換為雙百分比(%%),就可以分析一個完整的程式碼塊。以下為示例演示,供參考:
#### 使用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迴圈的平均執行時間為10.5微秒。請注意,命令選項-r和-n分別用於控制執行次數和迴圈次數。
3.程式碼塊中的每一行程式碼進行時間分析
到目前為止,我們只在分析一行程式碼或程式碼塊時檢視摘要統計資訊。如果我們想評估程式碼塊中每一行程式碼的效能呢?使用 Line_profiler 。
Line_profiler包可用於對任何函式執行逐行分析。要使用line_profiler軟體包,請執行以下步驟:
安裝— Line_profiler 包可以通過簡單的呼叫pip或conda Install來安裝。如果使用的是針對Python的anaconda發行版,建議使用conda安裝
#### 安裝line_profiler軟體包 conda install line_profiler
載入擴充套件—一旦安裝,你可以使用IPython來載入line_profiler:
#### 載入line_profiler的Ipython擴充套件 %load_ext line_profiler
時間分析函式—載入後,使用以下語法對任何預定義函式進行時間分析
%lprun -f function_name_only function_call_with_arguments
語法細節:
- 對line_profiler的呼叫以關鍵字%lprun開始,後跟命令選項-f
- 命令選項之後是函式名,然後是函式呼叫
在本練習中,我們將定義一個接受高度(以米為單位)和重量(以磅為單位)列表的函式,並將其分別轉換為釐米和千克。
#### 定義函式 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分析函式 %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]
輸出詳細資訊:
以14.6微秒為單位(參考第一行輸出)
生成的表有6列:
- 第1列(行#)—程式碼的行號(請注意,第#1行是故意從輸出中省略的,因為它只是函式定義語句)
- 第2列(命中)—呼叫該行的次數
- 第3列(時間)—在程式碼行上花費的時間單位數(每個時間單位為14.6微秒)
- 第4列(每次命中平均時間)—第3列除以第2列
- 第5列(%Time)—在所花費的總時間中,花在特定程式碼行上的時間百分比是多少
- 第6列(內容)—程式碼行的內容
你可以清楚地注意到,高度從米到釐米的轉換幾乎佔了總時間的72%。
結束語
利用每一行程式碼的執行時間,我們可以部署策略來提高程式碼的效率。在接下來的3個教程中,我們將分享一些最佳實踐來幫助你提高程式碼的效率。
我希望這篇教程能提供幫助,你能學到一些新東西。
以上就是python一些效能分析的技巧的詳細內容,更多關於python 效能分析的資料請關注我們其它相關文章!