Python性能分析技巧

Python性能分析技巧

當咱們開始精通編程語言時,咱們不只但願實現最終的編程目標,並且還但願可使咱們的程序更高效。
在本文中,咱們將學習一些Ipython的命令,這些命令能夠幫助咱們對Python代碼進行時間分析。
注意,在本教程中,我建議使用Anaconda。
1.分析一行代碼
要檢查一行python代碼的執行時間,請使用%timeit。下面是一個簡單的例子來了解它的工做原理:python

#### 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軟件包,請執行如下步驟:ide

  • 安裝—Line_profiler 包能夠經過簡單的調用pip或conda Install來安裝。若是使用的是針對Python的anaconda發行版,建議使用conda安裝
#### 安裝line_profiler軟件包
conda install line_profiler

加載擴展—一旦安裝,你可使用IPython來加載line_profiler:函數

#### 加載line_profiler的Ipython擴展
%load_ext line_profiler

時間分析函數—加載後,使用如下語法對任何預約義函數進行時間分析oop

%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%。
    結束語
    利用每一行代碼的執行時間,咱們能夠部署策略來提升代碼的效率。但願這篇文章能給你提供幫助,你能學到一些新東西。
    參考連接:https://towardsdatascience.com/did-you-know-you-can-measure-the-execution-time-of-python-codes-14c3b422d438
相關文章
相關標籤/搜索