當咱們開始精通編程語言時,咱們不只但願實現最終的編程目標,並且還但願可使咱們的程序更高效。
在本文中,咱們將學習一些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 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軟件包 conda install line_profiler
加載擴展—一旦安裝,你可使用IPython來加載line_profiler:函數
#### 加載line_profiler的Ipython擴展 %load_ext line_profiler
時間分析函數—加載後,使用如下語法對任何預約義函數進行時間分析oop
%lprun -f function_name_only function_call_with_arguments
語法細節:性能
#### 定義函數 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列:學習