網站首頁 編程語言 正文
python腳本性能分析
首先使用cd進入需要測試的腳本文件對應的目錄,然后再使用如下代碼完成對腳本的性能測試。
# enter the directory of document
cd (file directory)
# use pdb library for debuging
python -m cProfile test.py
我們可以看到我們獲取到了每一步操作所需要的時間。
對于如何測試單行代碼運行時間,可以看這篇python 代碼運行時間獲取方式(超鏈接點擊跳轉)。
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 -n1000for 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%。
原文鏈接:https://blog.csdn.net/u011699626/article/details/120338092
相關推薦
- 2021-12-13 C++??系統IO流介紹_C 語言
- 2023-05-08 Linux?C/C++?timeout命令實現運行具有時間限制功能_C 語言
- 2022-11-01 C++中的pair使用詳解_C 語言
- 2022-10-25 記一次生產環境死鎖問題分析
- 2022-05-26 Python借助with語句實現代碼段只執行有限次_python
- 2022-07-10 緩存路由關聯的兩個生命周期activated和deactivated
- 2022-06-01 Android實現簡單的照相功能_Android
- 2021-12-05 React實現一個通用骨架屏組件示例_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支