最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用Python標準庫進行性能測試

 更新時間:2019年06月25日 09:53:48   作者:煙火君  
這篇文章主要為大家詳細介紹了如何使用Python標準庫進行性能測試,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Profile 和 cProfile

在 Python 標準庫里面有兩個模塊可以用來做性能測試。

1. 一個是 Profile,它是一個純 Python 的實現(xiàn),所以會慢一些,如果你需要對模塊進行拓展,那么這個模塊比較合適。

2. 第二個是 cProfile,從名字就可以看出這是一個 C 語言的實現(xiàn)版,官方推薦在大多數(shù)情況下使用。
這兩者的接口和數(shù)據(jù)的輸出格式是完全一樣的,你可以在這兩者之間自由的切換,所以下面我們僅以 cProfile 為例進行介紹。

使用 cProfile 進行性能測試

在 cProfile 中,進行性能測試十分簡單,只需調(diào)用 run 方法,并將需要測試的函數(shù)及參數(shù)傳遞給它即可,下面我們對fib(n) 進行性能測試。

import cProfile

def fib(n):
 if n == 0:
 return 0
 if n == 1:
 return 1
 return fib(n-1) + fib(n-2)

if __name__ == '__main__':
 cProfile.run('fib(30)')

性能測試的結果如下圖

可以看到一共進行了 2692539 次函數(shù)調(diào)用,共耗時 0.815 秒。下面每一行對應于一個函數(shù)的調(diào)用情況,其中:

1. ncalls, 函數(shù)總共調(diào)用次數(shù);
2. tottime, 這個函數(shù)調(diào)用總共花費時間;
3. percall, 每個調(diào)用的平均花費時間;
4. cumtime, 總共累計花費時間;
5. percall, 每個調(diào)用的平均累計時間;
6. filename:lineno(function), 對應函數(shù)信息。

所以從圖中可以明顯看到幾乎的耗時都在fib上,而且函數(shù)調(diào)用數(shù)過多,這主要是因為函數(shù)是遞歸調(diào)用的,并且會產(chǎn)生很多冗余分支,所以程序需要進行優(yōu)化。有兩種方法進行改進,一是緩存fib(n)的信息,不需要每次都進行計算;二是將程序改為迭代式。

而對函數(shù)值進行緩存在 Python 3 里有一個簡單的裝飾器叫做lru_cache,可以自動的幫你緩存函數(shù)的值,而不需要自己手動存儲。

import functools

@functools.lru_cache(maxsize=None)
def fib(n):
 if n == 0:
 return 0
 if n == 1:
 return 1
 return fib(n-1) + fib(n-2)

運行結果如下:

可以看到,fib 函數(shù)只調(diào)用了 31 次,幾乎所有額外的調(diào)用都命中了緩存,遠遠小于前面的調(diào)用次數(shù),運行時間也得到了相當明顯的提升。同時使用下面的迭代版程序也運行得非???,這里就不再展開。

def fib(n):
 prev, cur = 0, 1
 if n == 0:
 return prev
 if n == 1:
 return cur
 count = 1
 while count < n:
 count += 1
 prev, cur = cur, prev + cur
 return cur

除了前面提到的 run 方法外,還有一個叫做 runctx 的方法,允許提供一些上下文參數(shù)。例如前面的 cProfile.run('fib(30)') 可以改為cProfile.runctx('fib', globals(), {'n':30})最后的運行結果是相同的。

最后,除了直接打印到命令行的方式,run 和 runctx 可以通過第二個參數(shù)傳遞文件名的方式將輸出結果寫入文件。

使用 pstats 對顯示進行控制

cProfile 雖然可以對程序進行簡單的性能測試,但是當程序過大,調(diào)用函數(shù)很多的時候,就需要一些對測試結果進行過濾和排序的工具了,而 pstats 就是這樣的一個工具。

# fib_profile.py
import cProfile
import pstats

for i in range(5):
 cProfile.run('fib(1000)', 'fib_profile_{}'.format(i))

stats = pstats.Stats('fib_profile_0')
for i in range(1, 5):
 stats.add('fib_profile_{}'.format(i))
stats.strip_dirs()
stats.sort_stats('cumulative')
stats.print_stats('fib')

上面的程序首先寫入了多個測試結果,然后初始化了 stats,可以通過 stats 的 add 方法添加新的文件,pstats 會自動的將結果聚合起來;然后 strip_dirs 將會移除文件名前面的路徑,只保留文件名;sort_stats 是對輸出結果進行排序,也就是在前面所說的那幾行里進行選擇(具體的可參閱官方文檔);最后的 print_stats 對結果進行輸出,在這面可以對行進行過濾,比如上面的程序就只輸出了包含 fib 的行;實際輸出結果如下。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python中Pyqt5使用Qlabel標簽進行視頻播放

    python中Pyqt5使用Qlabel標簽進行視頻播放

    這篇文章主要介紹了python中Pyqt5使用Qlabel實現(xiàn)標簽進行視頻播放,QLabel是界面中的標簽類,繼承自QFrame類,提供文本和圖像的顯示,是一種展示控件,下文相關內(nèi)容介紹需要的小伙伴可以參考一下
    2022-04-04
  • Python如何存儲數(shù)據(jù)到json文件

    Python如何存儲數(shù)據(jù)到json文件

    這篇文章主要介紹了Python如何存儲數(shù)據(jù)到json文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • Python 實時獲取任務請求對應的Nginx日志的方法

    Python 實時獲取任務請求對應的Nginx日志的方法

    本文給大家分享Python 實時獲取任務請求對應的Nginx日志的方法,本文通過實例代碼給大家介紹的非常詳細,需要的朋友參考下吧
    2021-07-07
  • Python+OpenCV進行不規(guī)則多邊形ROI區(qū)域提取

    Python+OpenCV進行不規(guī)則多邊形ROI區(qū)域提取

    ROI即感興趣區(qū)域。機器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域,稱為感興趣區(qū)域,ROI。本文將利用Python和OpenCV實現(xiàn)不規(guī)則多邊形ROI區(qū)域提取,需要的可以參考一下
    2022-03-03
  • Python設置和解除Word文檔保護的實現(xiàn)步驟

    Python設置和解除Word文檔保護的實現(xiàn)步驟

    在日常工作和學習中,我們經(jīng)常需要使用Word文檔來記錄和分享重要的信息,為了確保文檔內(nèi)容的安全性和完整性,了解如何保護和取消保護Word文檔顯得尤為重要,這篇博客將詳細介紹如何使用Python設置和解除Word文檔的保護,需要的朋友可以參考下
    2025-02-02
  • 基于Python實現(xiàn)火車票搶票軟件

    基于Python實現(xiàn)火車票搶票軟件

    每年的節(jié)假日一到,大家頭疼的總時同一個問題:你買到回家的票了嗎?尤其是大型的節(jié)日:國慶、春節(jié)等。本文將利用Python編寫一個火車票搶票軟件,感興趣的可以了解一下
    2022-07-07
  • 利用Python實現(xiàn)讀取Word文檔里的Excel附件

    利用Python實現(xiàn)讀取Word文檔里的Excel附件

    這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)讀取Word文檔里的Excel附件,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 簡單的編程0基礎下Python入門指引

    簡單的編程0基礎下Python入門指引

    這篇文章主要介紹了簡單的編程0基礎下Python入門指引,包括從各個系統(tǒng)的Python安裝和簡單的語句知識,需要的朋友可以參考下
    2015-04-04
  • Python使用回溯法子集樹模板解決爬樓梯問題示例

    Python使用回溯法子集樹模板解決爬樓梯問題示例

    這篇文章主要介紹了Python使用回溯法子集樹模板解決爬樓梯問題,簡單說明了爬樓梯問題并結合實例形式給出了Python回溯法子集樹模板解決爬樓梯問題的相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • Django中密碼的加密、驗密、解密操作

    Django中密碼的加密、驗密、解密操作

    這篇文章主要介紹了Django中密碼的加密、驗密、解密操作,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12

最新評論

民乐县| 平遥县| 河池市| 建昌县| 利辛县| 临安市| 含山县| 建湖县| 繁昌县| 临海市| 广灵县| 中宁县| 赤城县| 崇左市| 依兰县| 镇巴县| 宁南县| 西峡县| 柳林县| 工布江达县| 开远市| 柳河县| 云林县| 丹江口市| 苏尼特右旗| 南丰县| 工布江达县| 深圳市| 托克逊县| 凤凰县| 兴义市| 德江县| 青龙| 新和县| 永昌县| 故城县| 新乐市| 天气| 潞城市| 赫章县| 蒙阴县|