成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

DeBug Python代碼全靠print函數?換用這個一天2K+Star的工具吧

新聞 開發工具
小伙伴們,你們都怎樣 DeBug Python 代碼?是不是常用 print 大法?在本文介紹的這個項目中,deBug Python 代碼再也不需要 print 了。只要給有疑問的代碼加上裝飾器,各種信息一目了然,找出錯誤也就非常簡單了。

 

print 函數已老,DeBug 該靠 PySnooper 了~

小伙伴們,你們都怎樣 DeBug Python 代碼?是不是常用 print 大法?在本文介紹的這個項目中,deBug Python 代碼再也不需要 print 了。只要給有疑問的代碼加上裝飾器,各種信息一目了然,找出錯誤也就非常簡單了。

這個名為 PySnooper 的項目是剛開源的,僅僅一天就獲得了 2K+ 的 Star 量,當然這「一天」還沒結束,這個收藏量也會繼續刷新。

項目地址:https://github.com/cool-RR/pysnooper

Python 怎樣 DeBug?

如果寫著寫著模型,發現模型不 work 了,那么你該怎樣找出 Python 的錯誤語句?這種錯誤一般與語法無關,而是某個變量的運算發生了錯誤。接下來我們就要慢慢找哪個地方有問題了,這里最常見、最直觀的方法就是 print 大法。把我們懷疑的變量打印出來,總會找到異常的地方。

如果代碼中嵌入了單元測試,例如 assert 語句,那么還能縮小一些懷疑范圍。但通常我們都要多次嘗試,打印多個變量才能找到錯誤的地方。在 PyTorch 或 Keras 這樣的動態計算圖還好,打印出來的直接是一個值,像 TensorFlow 這樣的靜態計算圖,打印出來是張量信息而不是值,這就很尷尬了。

實際上不止是機器學習,在我們寫 Python 的時候,總是想搞清楚為什么寫的代碼在運行時有點不大對。很多讀者樂于使用斷點等成熟的 DeBug 工具,也有的直接使用 print 大法找錯誤的地方。但現在我們不需要擔心了,本文將介紹一個新的開源工具,它信心滿滿地呼吁到:「不要再使用 print 函數來 DeBug 啦~」

極簡DeBug工具PySnooper

一般情況下,想要知道哪一行代碼在運行、哪一行不運行、本地變量的值是多少時,大部分人會使用 print 函數,在關鍵部分打印某個或某組變量的值、形狀、類型等信息。

而 PySnooper 讓你能快速地獲得這些信息,且相比之下它不需要細致地寫 print 函數,只需要向感興趣的函數增加一個裝飾器就行了。我們會得到該函數的詳細 log,包含哪行代碼能運行、什么時候運行以及本地變量變化的確切時間。

相比于其他代碼智能工具,PySnooper 為何如此優秀?因為不需要任何設置,你就可以在劣等、不規則的企業代碼庫上使用 PySnooper。只需要加個裝飾器,并為日志輸出地址指定路徑就行了。

這樣說可能不太直觀,下面我們可以具體看個案例,PySnooper 的優秀就能一目了然。

PySnooper 案例

下面項目作者寫了一個函數以將數值轉換為二進制碼,該函數返回的是一個二進制列表。下面我們將裝飾器 @pysnooper.snoop() 加到該函數上,就大功告成了。

  1. import pysnooper  
  2. @pysnooper.snoop()  
  3. def number_to_bits(number):  
  4.  if number:  
  5.  bits = []  
  6.  while number:  
  7.  number, remainder = divmod(number, 2)  
  8.  bits.insert(0, remainder)  
  9.  return bits  
  10.  else:  
  11.  return [0]  
  12. number_to_bits(6)  

該函數返回的日志如下,我們可以看到在調用 number_to_bits 函數時,賦予參數 number 的初始值為 6。然后,PySnooper 就還是對著源代碼一行行分析了。

如上分析所示,函數每創建一個新變量,那么這個變量的值、這個變量的變化都會展示出來。而且 PySnooper 還將循環展開,因此變化的細節更加明確。最終 6 的二進制版本應該是 [1, 1, 0],它的變化過程也展示在 bits 變量中。

現在通過這些詳細信息,PySnooper 再也不用擔心我們用 print 函數強行 deBug 了。

PySnooper 詳細特征

如果標準錯誤輸出難以獲得,或者太長了,那么可以將輸出定位到本地文件:

  1. @pysnooper.snoop('/my/log/file.log'

查看一些非本地變量的值:

  1. @pysnooper.snoop(variables=('foo.bar''self.whatever')) 

展示我們函數中調用函數的 snoop 行:

  1. @pysnooper.snoop(depth=2

將所有 snoop 行以某個前綴開始,更容易定位和找到:

  1. @pysnooper.snoop(prefix='ZZZ '

演示 PySnooper

下面我們最開始嘗試使用 PySnooper 獲取 TensorFlow 的信息,如果它能獲取各種張量信息,那可就太強大了。

首先使用 pip 安裝包:

  1. pip install pysnooper 

果然,TensorFlow 這種靜態圖并不能很好地獲取信息,讀者也可嘗試一下。后面我們試了試 NumPy,希望能獲取整個計算流的信息。如下代碼所示,我們創建了兩個數組變量,并且 2×2 的矩陣會連乘多次,如果能追蹤到這種連乘,那就比較好處理錯誤。

  1. import pysnooper 
  2. import numpy as np 
  3. @pysnooper.snoop() 
  4. def multi_matmul(times): 
  5.  x = np.random.rand(22
  6.  w = np.random.rand(22
  7.  for i in range(times): 
  8.  x = np.matmul(x, w) 
  9.  return x 
  10. multi_matmul(3

對于 NumPy,該工具確實能追蹤所有可疑變量的變化過程。當然在實際運算中,矩陣乘法的維度會非常大,我們可以直接追蹤形狀(Shape),而不是具體的值。

【本文是51CTO專欄機構“機器之心”的原創譯文,微信公眾號“機器之心( id: almosthuman2014)”】 

戳這里,看該作者更多好文

責任編輯:張燕妮 來源: 機器之心
相關推薦

2025-04-24 09:21:00

2020-11-19 15:23:08

GitHub代碼工具

2023-12-21 08:02:31

React DnD拖拽庫組件

2023-12-07 19:13:48

Pythonprint

2022-06-08 13:33:47

Python代碼工具

2020-12-07 05:50:54

print()Python代碼

2022-04-11 11:38:44

Python代碼游戲

2020-08-18 14:48:00

AI 數據人工智能

2024-04-03 12:18:45

AI訓練

2019-04-28 09:56:15

程序員互聯網脫發

2019-08-05 08:00:04

AI 數據人工智能

2020-12-30 13:20:50

茅臺開源GitHub

2017-12-19 15:54:28

工作流Git二分法

2021-12-29 06:54:24

Debug Print工具

2021-05-13 10:20:44

谷歌工具技術

2020-02-13 10:54:29

源碼模式Mybatis

2021-02-03 21:15:44

Ansible系統運維系統管理員

2022-06-15 15:09:48

管理工具

2023-01-18 08:26:29

工具Mybatis代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久在线观看 | heyzo在线| 亚洲 欧美 日韩 在线 | 亚洲一区av在线 | 欧美久久久久 | 99热都是精品 | 免费看爱爱视频 | 欧美极品在线观看 | 91麻豆精品国产91久久久久久久久 | 2019天天干天天操 | 久久久免费精品 | 国产精品久久久久久久久久久久 | av毛片在线播放 | 污片在线免费观看 | 亚洲色欲色欲www | 国产一二三区在线 | 九色 在线 | 成人在线播放网站 | 色资源在线视频 | 欧美天堂在线观看 | 日韩一区二区三区在线 | 天天干天天干 | 成人免费小视频 | 精品日韩一区二区三区 | 国产亚洲精品成人av久久ww | 久久国产精品免费 | 欧美在线视频一区二区 | 日韩国产精品一区二区三区 | 亚洲一区二区三区免费视频 | 日本人麻豆| 日韩av在线不卡 | 日本在线观看视频 | 99这里只有精品视频 | 欧美精品啪啪 | 久久久久久久一区 | 激情 一区 | 完全免费在线视频 | 第一福利社区1024 | 中文字幕一区二区三区在线乱码 | 日韩精品一区二区三区在线观看 | 欧美性一区二区三区 |