日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

关于Python Profilers性能分析器

發布時間:2024/6/30 python 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于Python Profilers性能分析器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 介紹性能分析器

作者:btchenguang

profiler是一個程序,用來描述運行時的程序性能,并且從不同方面提供統計數據加以表述。Python中含有3個模塊提供這樣的功能,分別是cProfile, profile和pstats。這些分析器提供的是對Python程序的確定性分析。同時也提供一系列的報表生成工具,允許用戶快速地檢查分析結果。

Python標準庫提供了3個不同的性能分析器:

  • cProfile,推薦給大部分的用戶,是C的一個擴展應用,因為其合理的運行開銷,所以適合分析運行時間較長的。是基于lsprof。
  • profile,一個純python模塊,它的接口和cProfile一致。在分析程序時,增加了很大的運行開銷。如果你想擴展profiler的功能,可以試著繼承這個模塊
  • hotshot, 一個試驗性的c模塊,關注減少分析時的運行開銷,但是是以需要更長的數據后處理的次數為代價。不過這個模塊不再被維護,也有可能在新的python版本中被棄用。
  • 2. 使用方法

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 def?foo(): ????sum?=?0 ????for?i in?range(10000): ????????sum?+=?i ????sumA =?bar() ????sumB =?bar() ????return?sum ????? def?bar(): ????sum?=?0 ????for?i in?range(100000): ????????sum?+=?i ????return?sum ?? if?__name__ ==?"__main__": ????import?cProfile ????#直接把分析結果打印到控制臺 ????cProfile.run("foo()") ????#把分析結果保存到文件中,不過內容可讀性差...需要調用pstats模塊分析結果 ????cProfile.run("foo()", "result") ????#還可以直接使用命令行進行操作 ????#>python -m cProfile myscript.py -o result ????? ????import?pstats ????#創建Stats對象 ????p =?pstats.Stats("result") ????#這一行的效果和直接運行cProfile.run("foo()")的顯示效果是一樣的 ????p.strip_dirs().sort_stats(-1).print_stats() ????#strip_dirs():從所有模塊名中去掉無關的路徑信息 ????#sort_stats():把打印信息按照標準的module/name/line字符串進行排序 ????#print_stats():打印出所有分析信息 ????#按照函數名排序 ????p.strip_dirs().sort_stats("name").print_stats() ????#按照在一個函數中累積的運行時間進行排序 ????#print_stats(3):只打印前3行函數的信息,參數還可為小數,表示前百分之幾的函數信息 ????p.strip_dirs().sort_stats("cumulative").print_stats(3) ????#還有一種用法 ????p.sort_stats('time', 'cum').print_stats(.5, 'foo') ????#先按time排序,再按cumulative時間排序,然后打倒出前50%中含有函數信息 ????#如果想知道有哪些函數調用了bar,可使用 ????p.print_callers(0.5, "bar") ????#同理,查看foo()函數中調用了哪些函數 ????p.print_callees("foo")

    以上是profile以及pstats模塊的簡單應用.

    3.分析結果圖解

    ?

    ?

    4. 什么是確定性性能分析(Deterministic Profiling)

    確定性性能分析指的是反映所有的函數調用,返回,和異常事件的執行所用的時間,以及它們之間的時間間隔。相比之下,統計性性能分析指的是取樣有效的程序指令,然后推導出所需要的時間,后者花費比較少的開銷,但是給出的結果不夠精確。

    在Python中,因為其是解釋性語言,所以在執行程序的時候,會加入解釋器的執行,這部分的執行是不需要進行性能分析的。Python自動為每一個事件提供一個hook,來定位需要分析的代碼。除此之外,因為Python解釋型語言的本質往往需要在執行程序的時候加入很多其它的開銷,而確定性性能分析只會加入一點點處理開銷。這樣一來,確定性性能分析其實開銷不大,還可以提供豐富的統計信息。

    函數調用次數的統計能夠被用于確定程序中的bug,比如一個不符合常理的次數,明顯偏多之類的,還可以用來確定可能的內聯函數。函數內部運行時間的統計可被用來確定”hot loops”,那些需要運行時間過長,需要優化的部分;累積時間的統計可被用來確定比較高層次的錯誤,比如算法選擇上的錯誤。Python的性能分析可以允許直接比較算法的遞歸實現與迭代實現的。

    轉載于:https://www.cnblogs.com/pyxiaomangshe/p/8023593.html

    總結

    以上是生活随笔為你收集整理的关于Python Profilers性能分析器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。