1行のコードでデバッグと印刷を排除し、アルゴリズムの学習を支援

1行のコードでデバッグと印刷を排除し、アルゴリズムの学習を支援

[[442725]]

この記事はWeChatの公開アカウント「Python Technology」から転載したもので、著者はPai Senjiangです。この記事を転載する場合は、Python Technology Public Account にお問い合わせください。

アルゴリズムを書くときは、常に各行の各変数を 1 つずつデバッグする必要があり、場合によっては複数の print を記述する必要があります。アルゴリズムの問​​題を理解するには長い時間がかかります。 pysnooper モジュールは、操作中に変数の値を出力できます。

モジュールのインストール

  1. pip3 pysnooper をインストールする

簡単な例

簡単な例として、簡単な演繹アルゴリズムの問​​題を示します。

  1. pysnooper をインポートする
  2.  
  3. @pysnooper.snoop()
  4. def longestCommonPrefix(文字列):
  5. 解像度 = ''  
  6. i をzip(*strs)格納する場合:
  7. 印刷(i)
  8. len( set (i)) == 1の場合:
  9. 解像度 += i[0]
  10. それ以外 
  11. 壊す
  12. 戻り
  13.   
  14. __name__ == 'main'の場合:
  15. longestCommonPrefix([ "花" , "流れ" , "飛行" ])

結果:

  1. 3:38:25.863579 呼び出し 4 def longestCommonPrefix(strs):
  2. 23:38:25.864474 行 5 res = ''  
  3. 新しい変数:.......res = ''  
  4. 23:38:25.864474 6行i in zip(*strs):
  5. 新しい変数:.......i = ( 'f' , 'f' , 'f' )
  6. 23:38:25.865479 7行目 print(i)
  7. ( 'f' 'f' 'f' )
  8. 23:38:25.866471 8行目 if len( set (i))==1:
  9. 23:38:25.866471 行9 res+=i[0]
  10. 変更された変数: .. res = 'f'  
  11. 23:38:25.866471 6行i in zip(*strs):
  12. 変更された変数: .. i = ( 'l' , 'l' , 'l' )
  13. 23:38:25.866471 行 7 print(i)
  14. ( 'l' 'l' 'l' )
  15. 23:38:25.867468 行8 if len( set (i))==1:
  16. 23:38:25.867468 9行目 res+=i[0]
  17. 変更された変数: .. res = 'fl'  
  18. 23:38:25.868476 6行i in zip(*strs):
  19. 変更された変数: .. i = ( 'o' , 'o' , 'i' )
  20. 23:38:25.868476 7行目 print(i)
  21. ( 'お' 'お' '私' )
  22. 23:38:25.869463 8行目 if len( set (i))==1:
  23. 23:38:25.869463 11行目 改行
  24. 23:38:25.869463 12行目戻り
  25. 23:38:25.869463 12返すresを返す
  26. 戻り値: .. 'fl'  
  27. 経過時間: 00:00:00.008201

pysnooper は、行番号、行の内容、変数の結果など、実行プログラム全体を記録していることがわかります。このアルゴリズムの実際の状況を簡単に理解できます。また、コードをデバッグするために debug や print を使用する必要もありません。時間と労力を節約できます。メソッドの上に @pysnooper.snoop() という行を追加するだけです。

複雑な使用

pysnooperには複数のパラメータが含まれています。見てみましょう

出力

出力はデフォルトではコンソールに出力され、設定後はファイルに出力されます。サーバーで実行する場合、特定の時間にコードの問題が発生した場合にエラーの場所を特定しやすいですが、そうでない場合は途方に暮れやすくなります。実際、私はこの問題に何度も悩まされ、そのたびに大量の髪の毛が抜け落ちました。

  1. @pysnooper.snoop( 'D:\pysnooper.log' )
  2. def longestCommonPrefix(文字列):

結果の例:

ウォッチとウォッチ_explode

watch は、追跡のために非ローカル変数を設定するために使用されます。watch_explode は、すべての設定された変数が監視されるのではなく、未設定の変数のみが監視されることを意味します。これは、watch とまったく逆です。

  1. インデックス= 1
  2. @pysnooper.snoop(ウォッチ=( 'インデックス' ))
  3. def longestCommonPrefix(文字列):

結果例

監視パラメータが追加されていません

  1. 開始変数: .. strs = [ 'flower' , 'flow' , 'flight' ]
  2. 00:12:33.715367 呼び出し 5 def longestCommonPrefix(strs):
  3. 00:12:33.717324 行 7 res = ''  
  4. 新しい変数:.......res = ''  

ウォッチパラメータを追加すると、Starting var:.. indexになります。

  1. 開始変数: .. strs = [ 'flower' , 'flow' , 'flight' ]
  2. 開始変数: ..インデックス= 1
  3. 00:10:35.151036 呼び出し 5 def longestCommonPrefix(strs):
  4. 00:10:35.151288 行 7 res = ''  
  5. 新しい変数:.......res = ''  

深さ

depthは関数の深さを監視します

  1. @pysnooper.snoop(深さ=2)
  2. def longestCommonPrefix(文字列):
  3. その他のメソッド()

結果例

  1. 開始変数: .. strs = [ 'flower' , 'flow' , 'flight' ]
  2. 00:20:54.059803 呼び出し 5 def longestCommonPrefix(strs):
  3. 00:20:54.059803 行 6 otherMethod()
  4. 00:20:54.060785 16 def otherMethod() を呼び出します:
  5. 00:20:54.060785 行 17 x = 1
  6. 新しい変数:....... x = 1
  7. 00:20:54.060785 18行目 x = x + 1
  8. 変更された変数: .. x = 2
  9. 00:20:54.060785 18 x = x + 1を返す
  10. 戻り値: .. なし
  11. 00:20:54.061782 行 7 res = ''  

監視結果では、呼び出された関数を監視すると、レコードにインデントが追加され、そのローカル変数と戻り値が印刷されることがわかります。

接頭辞

プレフィックス 出力コンテンツのプレフィックス

  1. @pysnooper.snoop(プレフィックス = '--------------' )
  2. def longestCommonPrefix(文字列):

結果例

  1. -------------開始変数: .. strs = ['flower', 'flow', 'flight']  
  2. -------------00:39:13.986741 呼び出し 5 def longestCommonPrefix(strs):  
  3. -------------00:39:13.987218 行 6 res = ''  

相対時間

relative_time コードが実行される時間

  1. @pysnooper.snoop(相対時間 = True )
  2. def longestCommonPrefix(文字列):

結果例

  1. 開始変数: .. strs = [ 'flower' , 'flow' , 'flight' ]
  2. 00:00:00.000000 呼び出し 5 def longestCommonPrefix(strs):
  3. 00:00:00.001998 6行目 res = ''  
  4. 新しい変数:.......res = ''  
  5. 00:00:00.001998 7行i in zip(*strs):

最大変数長

max_variable_length 出力変数と例外の最大長。デフォルトは 100 文字です。100 文字を超えると切り捨てられます。出力を切り捨てないようにするには、max_variable_length=None を設定します。

  1. @pysnooper.snoop(最大変数長=5)
  2. def longestCommonPrefix(文字列):

結果例

  1. 開始変数: .. strs = [...]
  2. 00:56:44.343639 呼び出し 5 def longestCommonPrefix(strs):
  3. 00:56:44.344696 6行目 res = ''  
  4. 新しい変数:.......res = ''  
  5. 00:56:44.344696 7行目for i in zip(*strs):
  6. 新しい変数:....... i = (...)

要約する

この記事では、pysnooper ツールの使い方を紹介します。pysnooper はデバッグと印刷を減らすだけでなく、アルゴリズムの問​​題を理解するのにも役立ちます。

<<:  IEEE年末AIレビュー:ネットユーザーがGPT-3に悪態をつくよう教える、DeepMindが再びロボットを作る

>>:  中国の教授が犯罪認識率97%の人工知能「検察官」を開発、現在テスト中

ブログ    
ブログ    

推薦する

AI 主導のビジネス変革を通じてデジタル成熟を達成するにはどうすればよいでしょうか?

[[388979]]デジタル時代においては、情報の流れがあらゆるものの中心となります。すべてが感知...

量子コンピューティングとブロックチェーンの未来

量子コンピューティングはブロックチェーンを破壊するのか、それともより安全にするのか? 01 序文コン...

Analysys OLAP アルゴリズム コンペティションの結果が発表され、オープン ソース グループのダーク ホースがその腕前を披露しました。

100日間以上にわたる激しい競争では、国内トップクラスのテクノロジー企業40社以上が競い合い、競争...

人工知能はビッグデータ天体物理学の時代へのマスターキーとなるのでしょうか?

[[386945]]私はかつて「ウォーリーと一緒に星を見上げる」というタイトルの記事を書き、ビッグ...

...

カメラのようにズームして、写真の細部を塗りつぶし、スタイルをカスタマイズ。AIペイントツールMidjourneyが再びアップデート

有名な AI ペイントツール Midjourney が再びユーザーに衝撃を与えました。先月バージョン...

LRU (Least Recently Used) キャッシュアルゴリズムの実装

[[349478]] LRU は Least Recently Used の略で、よく使われるページ...

...

人工知能はサイバーセキュリティにとって役立つのか、それとも脅威となるのか?

企業に対するセキュリティ上の脅威は常に存在していましたが、インターネットの発展により、脅威は物理空間...

アクセンチュア:AIが新しいUIとなり、7年後にはスクリーンレス時代が到来

編集者注: Amazon の Echo スマート スピーカーや自動運転車などのスクリーンレス ユーザ...

...

ChatGPTが使用する機械学習技術

著者 |ブライト・リャオ「プログラマーから見たChatGPT」の記事では、開発者のChatGPTに対...

シングルチップマイクロコンピュータ用のいくつかのC言語アルゴリズム

[[406759]]マイクロコントローラの主な機能は、周辺機器を制御し、特定の通信とデータ処理を実現...

新しいテクノロジー、古い問題: NLP における聞こえない「声」

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

11 の基本的なニューラル ネットワーク アーキテクチャの視覚的な説明

標準、再帰、畳み込み、オートエンコーダネットワークディープラーニングの急速な発展により、多種多様なタ...