0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python 優(yōu)化—算出每條語句執(zhí)行時間

科技綠洲 ? 來源:Python數(shù)據(jù)科學(xué) ? 作者:Python數(shù)據(jù)科學(xué) ? 2023-11-03 11:01 ? 次閱讀

Python寫的程序,確實在性能上會比其他語言差一些,這是因為Python為了最大化 開發(fā)效率 ,犧牲了一定的 運行效率 。開發(fā)效率和運行效率往往是魚與熊掌不可兼得的關(guān)系。

不過,程序性能較差有很多原因,并不能全把鍋甩到Python身上,我們應(yīng)該首先從自己的代碼上找原因,找原因最快的方法就是算出自己寫的語句或函數(shù)的 執(zhí)行時間 。這時候,很多人都會選擇用以下的形式打印出語句的執(zhí)行時間:

圖片

這是一種比較低效的做法,如果你有上萬條語句要測試,想用這個方法來找到瓶頸簡直是大海撈針。幸好,得益于Python強大的社區(qū)功能,我們有很多關(guān)于效率的模塊可以使用,今天要介紹的是 line_profiler , 它可以算出函數(shù)里每條語句的占用時間。

我們將使用上次電影人臉識別中的代碼進行講解:Python 識別電影中的人臉,不過要注意,這篇推送里的函數(shù)少傳遞了幾個參數(shù),正確參數(shù)請點擊該推送下方的閱讀原文進行查看哦。

1.準(zhǔn)備

Python環(huán)境當(dāng)然是必備的,如果你還沒有安裝Python,可以看這篇文章:超詳細(xì)Python安裝指南。

打開cmd/terminal輸入以下命令安裝line_profile:

pip install line_profiler

windows機器如果出現(xiàn) Microsoft Visual C++ 14.0 is required 這樣的錯誤,請前往微軟官網(wǎng),下載vs2015勾選"適用于visual C++2015的公共工具" 進行安裝。

如果出現(xiàn):ModuleNotFoundError: No module named 'skbuild'的情況,請輸入以下命令安裝scikit-build:

pip install scikit-build

實在還是安裝不上的話 ,可以下載anaconda,輸入以下命令安裝:

conda install -c anaconda line_profiler

2.使用

使用方式非常簡單,比如原來我們在讀取人臉的代碼中,主函數(shù)是這樣的:

圖片

我們要測的是read_pic_save_face函數(shù)中所有語句的執(zhí)行時間,只需要這樣調(diào)用line_profiler:

圖片

這樣就可以獲得該函數(shù)所有語句的執(zhí)行時間報表。當(dāng)然,它還有許多其他的調(diào)用方法,具體可以看line_profiler說明文檔: *
https://github.com/rkern/line_profiler*

3.閱讀報告

line_profiler報告包括幾個部分:

Line: 語句位于第幾行 **
Hits: 該行被執(zhí)行的次數(shù)
Time: 該語句運行的總時間
Per Hit: 該語句運行一次的平均耗時
% Time: 該語句占總時間的比重**

圖片

可以看到,我們的這份代碼主要是在face_cascade.detectMultiScale 耗時最久,這是opencv的分類器執(zhí)行效率問題。知道了是這里的效率問題,優(yōu)化就有一個目標(biāo)了。

這一部分的優(yōu)化,我們可以從硬件方面入手,讓OpenCV在GPU上運行算法,這樣做性能將遠(yuǎn)超在CPU上運行的性能,這是絕招。其次就是利用多線程計算(沒試過,不確定是否有用,或許下次可以試一下)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2716

    瀏覽量

    47529
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3788

    瀏覽量

    81105
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4791

    瀏覽量

    68694
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84756
收藏 人收藏

    評論

    相關(guān)推薦

    基于KEIL軟件的C語言編程,如何計算一段程序的執(zhí)行時間呢?

    如題,一段程序執(zhí)行時間怎樣確定,假如是把每條語句執(zhí)行時間累加,那么每條語句
    發(fā)表于 01-18 06:10

    如何計算AURIX微控制器指令執(zhí)行時間?

    對于 AURIX TC38x,在數(shù)據(jù)表中,最大 CPU 頻率為 300MHz,如下所示- 因此,在此頻率下,每條指令的執(zhí)行時間將為:1/300 MHz = 3.33 ns。 這種理解正確嗎? 否則,如何計算每條指令的
    發(fā)表于 01-23 08:08

    嵌套循環(huán)執(zhí)行時間計算

    假如兩層循環(huán)都要執(zhí)行16369次,那么執(zhí)行時間如何計算呢?當(dāng)然里面不添加任何操作,里面的執(zhí)行時間是最短,不過這樣的意義不大。如果里面僅僅是一個賦值操作呢?int i =90
    發(fā)表于 12-30 15:24

    請問C2000中尋址結(jié)構(gòu)體或者共同體需要的執(zhí)行時間長嗎?

    ].bit.ORDER = i; //其中DCA_L是局部的共同體變量想請問下:這個語句相對于普通變量的賦值語句,執(zhí)行時間要長很多嗎?為什么呢?如果我想減少執(zhí)行時間,能做什么改進?比如
    發(fā)表于 06-14 03:04

    如何計算執(zhí)行時間

    嗨,大家好,有沒有方法計算程序或程序的一部分(在兩個斷點之間)的執(zhí)行時間?比如秒表之類的?我希望任何人都能幫上忙!搶劫 以上來自于百度翻譯 以下為原文Hi all, Is there a way
    發(fā)表于 07-29 08:07

    如何使用CYCLECOUNTER快速的測量執(zhí)行時間?

    系統(tǒng)基于該寄存器實現(xiàn)了一個64位的循環(huán)周期計數(shù)器CYCLECOUNTER,能夠精確的測量程序的執(zhí)行時間,并且可以與C-SPY宏結(jié)合,成為開發(fā)人員非常有用的一個工具。CYCLECOUNTER的顯示在IAR
    發(fā)表于 01-08 13:40

    如何在MCU上測量代碼執(zhí)行時間?

    期限(deadline)要求。測量部分代碼的實際執(zhí)行時間可以幫助我們找到代碼中的時間關(guān)鍵點。本文將展示如何輕松測量和顯示基于Cortex-M MCU的代碼片段的執(zhí)行時間。測量執(zhí)行時間
    發(fā)表于 07-16 09:59

    RT1052執(zhí)行時間

    最近測試了下RT1052 的if判斷語句執(zhí)行時間。變量和0比較,用時在4ms。變量和其他非0數(shù)比較,用時8ms左右。這個正常么?各位道友。
    發(fā)表于 08-11 09:58

    RTThread Studio該如何查看代碼執(zhí)行時間

    想要查看代碼執(zhí)行時間,RTThread Studio下面應(yīng)該如何操作?如何適應(yīng)RTThread Studio查看某一段代碼的執(zhí)行時間
    發(fā)表于 09-20 14:30

    MPC5744p如何優(yōu)化程序執(zhí)行時間?

    作為 MPC5744p 的新手,我遇到了一個關(guān)于如何優(yōu)化程序執(zhí)行時間的問題。 這是我的中斷服務(wù)例程中代碼行的圖片。 ↓這張圖片顯示了執(zhí)行我測試過的代碼行之前的定時器值 ↓這張圖片顯示了執(zhí)行
    發(fā)表于 06-05 12:50

    如何測量ARM Cortex-M MCU代碼的執(zhí)行時間

    期限(deadline)要求。測量部分代碼的實際執(zhí)行時間可以幫助我們找到代碼中的時間關(guān)鍵點。 本文將展示如何輕松測量和顯示基于Cortex-M MCU的代碼片段的執(zhí)行時間。 測量執(zhí)行時間
    的頭像 發(fā)表于 08-26 09:20 ?3688次閱讀
    如何測量ARM Cortex-M MCU代碼的<b class='flag-5'>執(zhí)行時間</b>

    MCU上的代碼執(zhí)行時間

    編寫的,而且開發(fā)人員常常被迫對代碼進行手工優(yōu)化,可能會回到匯編語言,以滿足性能的需求。測量代碼部分的實際執(zhí)行時間可以幫助找到代碼中的熱點。本文將說明如何可以方便地測量和顯示在基于Cortex-M MCU的...
    發(fā)表于 10-28 13:36 ?12次下載
    MCU上的代碼<b class='flag-5'>執(zhí)行時間</b>

    可以節(jié)省Python執(zhí)行時間的四種方式

    今天我想和大家分享 4 個省時的 Python 技巧,可以節(jié)省 10~20% 的 Python 執(zhí)行時間。
    的頭像 發(fā)表于 05-13 17:01 ?2733次閱讀

    使用STM32定時器測量程序執(zhí)行時間的方法詳解

    在單片機的固件開發(fā)過程中,有的時候需要評估固件代碼的執(zhí)行性能,會對部分關(guān)鍵程序代碼的執(zhí)行時間進行測量。通常會用到的測量程序執(zhí)行時間的方法是使用示波器進行測量。一般步驟是借助單片機的某一個GPIO口
    的頭像 發(fā)表于 01-17 15:11 ?8442次閱讀
    使用STM32定時器測量程序<b class='flag-5'>執(zhí)行時間</b>的方法詳解

    TPT19新特性之最壞情況執(zhí)行時間的指示

    在TPT 19中,首次有了最壞情況執(zhí)行時間的早期預(yù)警系統(tǒng)——這已經(jīng)在本地主機上用于測試執(zhí)行。 ? 基本原則:對每個測試步驟的執(zhí)行時間進行測量。這使您可以快速輕松地確定哪些測試和哪些條件會影響本地
    的頭像 發(fā)表于 04-27 10:08 ?491次閱讀
    TPT19新特性之最壞情況<b class='flag-5'>執(zhí)行時間</b>的指示