作者|Ujjwal Dalmia
編譯|VK
來源|Towards Data Science

當我們開始精通編程語言時,我們不僅希望實作最終目標,而且希望使我們的程式高效,
在這個教程中,我們將學習一些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個教程中,我們將分享一些最佳實踐來幫助你提高代碼的效率,
我希望這篇教程能提供幫助,你能學到一些新東西,
原文鏈接:https://towardsdatascience.com/did-you-know-you-can-measure-the-execution-time-of-python-codes-14c3b422d438
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/79691.html
標籤:其他
上一篇:PyTorch中基于TPU的FastAI多類影像分類
下一篇:DIoU-NMS
