亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

10種檢測(cè)Python程序運(yùn)行時(shí)間、CPU和內(nèi)存占用的方法

 更新時(shí)間:2015年04月01日 10:41:53   作者:Marina Mele  
這篇文章主要介紹了10種檢測(cè)Python程序運(yùn)行時(shí)間、CPU和內(nèi)存占用的方法,包括利用Python裝飾器或是外部的Unix Shell命令等,需要的朋友可以參考下

在運(yùn)行復(fù)雜的Python程序時(shí),執(zhí)行時(shí)間會(huì)很長(zhǎng),這時(shí)也許想提高程序的執(zhí)行效率。但該怎么做呢?

首先,要有個(gè)工具能夠檢測(cè)代碼中的瓶頸,例如,找到哪一部分執(zhí)行時(shí)間比較長(zhǎng)。接著,就針對(duì)這一部分進(jìn)行優(yōu)化。

同時(shí),還需要控制內(nèi)存和CPU的使用,這樣可以在另一方面優(yōu)化代碼。

因此,在這篇文章中我將介紹7個(gè)不同的Python工具,來(lái)檢查代碼中函數(shù)的執(zhí)行時(shí)間以及內(nèi)存和CPU的使用。
1. 使用裝飾器來(lái)衡量函數(shù)執(zhí)行時(shí)間

有一個(gè)簡(jiǎn)單方法,那就是定義一個(gè)裝飾器來(lái)測(cè)量函數(shù)的執(zhí)行時(shí)間,并輸出結(jié)果:
 

import time
from functools import wraps
 
def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
        (function.func_name, str(t1-t0))
        )
    return result
  return function_timer

接著,將這個(gè)裝飾器添加到需要測(cè)量的函數(shù)之前,如下所示:
 

@fn_timer
def myfunction(...):
...

例如,這里檢測(cè)一個(gè)函數(shù)排序含有200萬(wàn)個(gè)隨機(jī)數(shù)字的數(shù)組所需的時(shí)間:
 

@fn_timer
def random_sort(n):
  return sorted([random.random() for i in range(n)])
 
if __name__ == "__main__":
  random_sort(2000000)

執(zhí)行腳本時(shí),會(huì)看到下面的結(jié)果:
 

Total time running random_sort: 1.41124916077 seconds

2. 使用timeit模塊

另一種方法是使用timeit模塊,用來(lái)計(jì)算平均時(shí)間消耗。

執(zhí)行下面的腳本可以運(yùn)行該模塊。

python -m timeit -n 4 -r 5 -s "import timing_functions" "timing_functions.random_sort(2000000)"

這里的timing_functions是Python腳本文件名稱(chēng)。

在輸出的末尾,可以看到以下結(jié)果:
 

4 loops, best of 5: 2.08 sec per loop

這表示測(cè)試了4次,平均每次測(cè)試重復(fù)5次,最好的測(cè)試結(jié)果是2.08秒。

如果不指定測(cè)試或重復(fù)次數(shù),默認(rèn)值為10次測(cè)試,每次重復(fù)5次。
3. 使用Unix系統(tǒng)中的time命令

然而,裝飾器和timeit都是基于Python的。在外部環(huán)境測(cè)試Python時(shí),unix time實(shí)用工具就非常有用。

運(yùn)行time實(shí)用工具:
 

$ time -p python timing_functions.py

輸出結(jié)果為:
 

Total time running random_sort: 1.3931210041 seconds
real 1.49
user 1.40
sys 0.08

第一行來(lái)自預(yù)定義的裝飾器,其他三行為:

  •     real表示的是執(zhí)行腳本的總時(shí)間
  •     user表示的是執(zhí)行腳本消耗的CPU時(shí)間。
  •     sys表示的是執(zhí)行內(nèi)核函數(shù)消耗的時(shí)間。

注意:根據(jù)維基百科的定義,內(nèi)核是一個(gè)計(jì)算機(jī)程序,用來(lái)管理軟件的輸入輸出,并將其翻譯成CPU和其他計(jì)算機(jī)中的電子設(shè)備能夠執(zhí)行的數(shù)據(jù)處理指令。

因此,Real執(zhí)行時(shí)間和User+Sys執(zhí)行時(shí)間的差就是消耗在輸入/輸出和系統(tǒng)執(zhí)行其他任務(wù)時(shí)消耗的時(shí)間。
4. 使用cProfile模塊

如果想知道每個(gè)函數(shù)和方法消耗了多少時(shí)間,以及這些函數(shù)被調(diào)用了多少次,可以使用cProfile模塊。
 

$ python -m cProfile -s cumulative timing_functions.py

現(xiàn)在可以看到代碼中函數(shù)的詳細(xì)描述,其中含有每個(gè)函數(shù)調(diào)用的次數(shù),由于使用了-s選項(xiàng)(累加),最終結(jié)果會(huì)根據(jù)每個(gè)函數(shù)的累計(jì)執(zhí)行時(shí)間排序。

201541103516157.jpg (690×654)

讀者會(huì)發(fā)現(xiàn)執(zhí)行腳本所需的總時(shí)間比以前要多。這是由于測(cè)量每個(gè)函數(shù)的執(zhí)行時(shí)間這個(gè)操作本身也是需要時(shí)間。
5. 使用line_profiler模塊

line_profiler模塊可以給出執(zhí)行每行代碼所需占用的CPU時(shí)間。

首先,安裝該模塊:
 

$ pip install line_profiler

接著,需要指定用@profile檢測(cè)哪個(gè)函數(shù)(不需要在代碼中用import導(dǎo)入模塊):
 

@profile
def random_sort2(n):
  l = [random.random() for i in range(n)]
  l.sort()
  return l
 
if __name__ == "__main__":
  random_sort2(2000000)

最好,可以通過(guò)下面的命令獲得關(guān)于random_sort2函數(shù)的逐行描述。
 

$ kernprof -l -v timing_functions.py

其中-l表示逐行解釋?zhuān)?v表示表示輸出詳細(xì)結(jié)果。通過(guò)這種方法,我們看到構(gòu)建數(shù)組消耗了44%的計(jì)算時(shí)間,而sort()方法消耗了剩余的56%的時(shí)間。

201541103623876.jpg (690×208)

同樣,由于需要檢測(cè)執(zhí)行時(shí)間,腳本的執(zhí)行時(shí)間更長(zhǎng)了。
6. 使用memory_profiler模塊

memory_profiler模塊用來(lái)基于逐行測(cè)量代碼的內(nèi)存使用。使用這個(gè)模塊會(huì)讓代碼運(yùn)行的更慢。

安裝方法如下:

 pip install memory_profiler

另外,建議安裝psutil包,這樣memory_profile會(huì)運(yùn)行的快一點(diǎn):
 

$ pip install psutil

與line_profiler相似,使用@profile裝飾器來(lái)標(biāo)識(shí)需要追蹤的函數(shù)。接著,輸入:
 

$ python -m memory_profiler timing_functions.py

腳本的執(zhí)行時(shí)間比以前長(zhǎng)1或2秒。如果沒(méi)有安裝psutil包,也許會(huì)更長(zhǎng)。

201541103657211.jpg (690×145)

從結(jié)果可以看出,內(nèi)存使用是以MiB為單位衡量的,表示的mebibyte(1MiB = 1.05MB)。
7. 使用guppy包

最后,通過(guò)這個(gè)包可以知道在代碼執(zhí)行的每個(gè)階段中,每種類(lèi)型(str、tuple、dict等)分別創(chuàng)建了多少對(duì)象。

安裝方法如下:
 

$ pip install guppy

接著,將其添加到代碼中:
 

from guppy import hpy
 
def random_sort3(n):
  hp = hpy()
  print "Heap at the beginning of the functionn", hp.heap()
  l = [random.random() for i in range(n)]
  l.sort()
  print "Heap at the end of the functionn", hp.heap()
  return l
 
if __name__ == "__main__":
  random_sort3(2000000)

運(yùn)行代碼:
 

$ python timing_functions.py

可以看到輸出結(jié)果為:

201541103732081.jpg (688×533)

通過(guò)在代碼中將heap()放置在不同的位置,可以了解到腳本中的對(duì)象創(chuàng)建和刪除操作的流程。

如果想學(xué)習(xí)更多關(guān)于Python代碼速度優(yōu)化方面的知識(shí),我建議你去讀這本書(shū)《High Performance Python: Practical Performant Programming for Humans, september 2014.》

希望這篇文章能偶幫到你!^_^

相關(guān)文章

  • Python爬蟲(chóng)之Spider類(lèi)用法簡(jiǎn)單介紹

    Python爬蟲(chóng)之Spider類(lèi)用法簡(jiǎn)單介紹

    這篇文章主要介紹了Python爬蟲(chóng)之Spider類(lèi)用法簡(jiǎn)單介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 深入理解Django的中間件middleware

    深入理解Django的中間件middleware

    這篇文章主要給大家介紹了關(guān)于Django中的中間件middleware的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-03-03
  • python列表的增刪改查實(shí)例代碼

    python列表的增刪改查實(shí)例代碼

    下面小編就為大家分享一篇python列表的增刪改查實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • python 使用pandas讀取csv文件的方法

    python 使用pandas讀取csv文件的方法

    這篇文章主要介紹了python 使用pandas讀取csv文件的方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 利用Python實(shí)現(xiàn)文件讀取與輸入以及數(shù)據(jù)存儲(chǔ)與讀取的常用命令

    利用Python實(shí)現(xiàn)文件讀取與輸入以及數(shù)據(jù)存儲(chǔ)與讀取的常用命令

    這篇文章主要給大家介紹了關(guān)于利用Python實(shí)現(xiàn)文件讀取與輸入以及數(shù)據(jù)存儲(chǔ)與讀取的常用命令,文中還介紹了用python循環(huán)保存文件并循環(huán)讀取文件的方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • python基于openpyxl生成excel文件

    python基于openpyxl生成excel文件

    這篇文章主要介紹了python基于openpyxl生成excel文件的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • 用Python制作mini翻譯器的實(shí)現(xiàn)示例

    用Python制作mini翻譯器的實(shí)現(xiàn)示例

    這篇文章主要介紹了用Python制作mini翻譯器的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Flask搭建一個(gè)API服務(wù)器的步驟

    Flask搭建一個(gè)API服務(wù)器的步驟

    Flask真是一個(gè)強(qiáng)大且簡(jiǎn)介的web框架,能夠快速搭建web服務(wù)器,本文主要介紹了Flask搭建一個(gè)API服務(wù)器的步驟,分享給大家,感興趣的可以了解一下
    2021-05-05
  • 基于Python實(shí)現(xiàn)開(kāi)發(fā)釘釘通知機(jī)器人

    基于Python實(shí)現(xiàn)開(kāi)發(fā)釘釘通知機(jī)器人

    在項(xiàng)目協(xié)同工作或自動(dòng)化流程完成時(shí),我們需要用一定的手段通知自己或他人。Telegram 非常好用,幾個(gè)步驟就能創(chuàng)建一個(gè)機(jī)器人,可惜在國(guó)內(nèi)無(wú)法使用。所以本文就來(lái)開(kāi)發(fā)一個(gè)釘釘通知機(jī)器人吧
    2023-02-02
  • python對(duì)url格式解析的方法

    python對(duì)url格式解析的方法

    這篇文章主要介紹了python對(duì)url格式解析的方法,涉及Python針對(duì)URL解析的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05

最新評(píng)論