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%の人工知能「検察官」を開発、現在テスト中

ブログ    
ブログ    
ブログ    

推薦する

...

Java ME での衝突検出アルゴリズムの実装

Java ME ゲーム開発では、衝突検出アルゴリズムを実装する必要があることがよくあります。たとえば...

素晴らしい配達でした!インテルビジョン観測室は、実体経済の発展に向けた新たな道を切り開きます|インテルビジョン

5月23日、 「実体経済の新たなエンジンを動かす『中核』のダイナミックエネルギー」をテーマにしたイ...

AI音声アシスタントと仮想IP画像の組み合わせは、ブランドマーケティングの新たな名刺になるかもしれない

最近、世界インターネット会議で「世界インターネット発展報告書2020」が発表されました。報告書では、...

ついにデータサイエンス、機械学習、人工知能を説明する人が現れる

01 データサイエンスとは何ですか? データサイエンスは何をするのですか?まずはデータサイエンスの分...

GPT-4 の創造性は人間を完全に超えています!最新の創造性テストGPT4は上位1%にランクイン

最近、GPT-4に関連した創造的思考テストが人気になっています。モンタナ大学とUMウエスタン大学の研...

2024年に注目すべきサイバー犯罪の5つの傾向

サイバー犯罪は人工知能の時代に入り、ランサムウェアやAPTなどの高度な脅威は「サイバー犯罪技術革命」...

デジタル時代においてヘルスケアサービスをより良くサポートするにはどうすればよいでしょうか?

アルカテル・ルーセント・エンタープライズの英国ヘルスケア部門責任者であるニール・ハンフリー氏が、デジ...

MotionLM: 言語モデルとしてのマルチエージェント動作予測

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

Spark Graphx はグラフの最大クリークマイニング、疑似並列アルゴリズムを実装します

[[206073]] ####背景:#### Spark graphxは最大クリークマイニングアルゴ...

エコノミスト:AI産業の急成長によりサンフランシスコの雇用は38%回復

7月7日のニュースによると、サンフランシスコのテクノロジー業界は、数か月に及ぶレイオフの後、人工知能...

経済の冬の後には人工知能の春が来る

企業が選択する経済発展の道は、多くの場合、時代の背景によって決まります。さまざまな経済状況下で適切な...

ByteDance Wanka Cluster の技術詳細が明らかに: GPT-3 トレーニングが 2 日間で完了、コンピューティング パワーの使用率は Nvidia Megatron-LM を上回る

Sora のテクノロジーの分析が進むにつれて、 AI インフラストラクチャの重要性がますます明らかに...

...