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 の洞察: インテリジェント ビデオはエッジをどのように形成するのか?

ビデオの需要と視覚データの理解のための AI の使用が増加するにつれて、カメラの数と生成されるデータ...

人工知能の数学的基礎 - 線形代数における行列

この記事は、行列の性質、行列の原理、行列の応用という 3 つの側面から、人工知能の数学的基礎である線...

世界最強のモデル クロード3号が物理・化学を覆す!博士課程の1年間の実験の結果が2時間で解読され、ネットユーザーは「科学的研究はもう存在しない」と叫んだ。

クロード3号は今も奇跡を起こし続けています。公開からわずか数日後、ますます多くの博士号取得者が、未発...

...

1 つの記事で 26 個のニューラル ネットワーク活性化関数 (ReLU から Sinc まで) を紹介します

ニューラル ネットワークでは、活性化関数によって、指定された入力セットからノードの出力が決定されます...

大きなモデルが必ずしも良いモデルとは限らない。小さな機械学習こそが未来だ

NASA の推進により、電子機器の小型化は消費者向け製品産業全体に広がりました。ベートーヴェンの全作...

ICML 優勝者 Lu Yucheng: 分散型機械学習の理論的な限界は何ですか?

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

AI時代に従業員がIT業務の価値を証明する方法

[[251301]]ロボットがあなたの仕事を奪う可能性はありますか? あなたはロボットの仕事を手伝う...

スタートアップ企業がAIを活用して声優の「デジタルツイン」を開発し、声優自身の声を使ったコンテンツを生成する

ブルームバーグが14日に報じたところによると、声優のシッキー・ジョーンズがAIスタートアップ企業モー...

AI がデータセンターのワークロード管理の課題を解決する方法

データセンターのワークロードが急増し続ける中、効率性を向上させてコストを削減しながら IT チームの...

アリババクラウド南京雲奇カンファレンス:スマート製造モデルの共有と最先端技術の発表

[51CTO.comより引用] 本日、アリババクラウドカンファレンス南京サミットが正式に開催され、ま...

Rocket Launch: 効率的で軽量なネットワーク トレーニング フレームワーク

まとめクリックスルー率の推定などのオンラインリアルタイム応答システムでは、応答時間に関して非常に厳し...

...

負荷分散スケジューリングアルゴリズムを見てみましょう

[[122758]]ロード ホストは、スケジューリング メソッドまたはアルゴリズムと呼ばれる多くの負...