python效能差 python一些效能分析的技巧

2021-10-11 20:32:25 字數 2855 閱讀 5340

當我們開始精通程式語言時,我們不僅希望實現最終目標,而且希望使我們的程式高效。

在這個教程中,我們將學習一些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:

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效能監控

profiler是乙個程式,用來描述執行時的程式效能,並且從不同方面提供統計資料加以表述。python中含有3個模組提供這樣的功能,分別是cprofile,profile和pstats。這些分析器提供的是對python程式的確定性分析。同時也提供一系列的報表生成工具,允許使用者快速地檢查分析結果。p...

python 實現差商

差商計算中沒有加入o h 數學還在繼續加強中,理解的可能有點不到位,希望理解有誤的地方大家能給出寶貴建議 coding utf 8 from sympy import 向前差商的函式 def forward f1.subs x,0.5 g1 f.subs x,0.5 h f.subs x,0.5 h...

python 日期差計算

def getday of year year if year 4 0 and year 100 0 or year 400 0 return 366 else return 365 def getday of month year,month daysofmonths 31,28,31,30,31...