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

ブログ    
ブログ    
ブログ    

推薦する

農業革命: 世界市場における作物収穫ロボットの台頭

農業の世界は、世界の市場に革命を起こすであろう驚異的な技術である作物収穫ロボットの登場により、パラダ...

...

経路計画における DRL と OR アルゴリズム: 比較と展望

1. 運用最適化とは何ですか?オペレーションズ・リサーチは、数学、コンピューターサイエンス、経営学の...

人工知能と機械学習における13の共通概念

[[422893]] 01 人工知能アラン・チューリングは人工知能を次のように定義しました。カーテン...

Raft アルゴリズムの原理と CMQ への応用 (パート 1)

[[202009]]導入Raft アルゴリズムは分散コンセンサス アルゴリズムです。 Paxos ...

ソフトウェア開発を簡素化する 5 つの機械学習ツール

[51CTO.com クイック翻訳] 機械学習を使用する開発者の間での議論のほとんどは、AI ベース...

保存しておくべき機械学習チートシート 27 選

機械学習にはさまざまな側面があり、調査を始めたときに、特定のトピックの要点を簡潔にリストしたさまざま...

コード生成のためのツリーベースのTransformerアーキテクチャ

導入:コード生成は、プログラマーの生産性を大幅に向上させる可能性を秘めた重要な AI 問題です。自然...

成熟したAIは独自のコードを書くべきだ。IBMは55の言語で5億行のコードデータセットを公開

[[400902]]この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI...

OpenAIは米国で以前に申請していた「GPT-5」の商標を中国で登録申請した。

8月10日、国家知識産権局商標局の公式サイトによると、OPENAI OPCO, LLCは先月末に2...

マイクロソフト リサーチの新たな成果: 携帯電話のカメラを使用して心肺バイタル サインを遠隔測定

Microsoft Research は、消費者の手に握られたスマートフォンのカメラを使用して、遠隔...

スマートホームは私たちを監視しているのでしょうか?

スマートテクノロジーをどのように活用するのでしょうか?ほとんどのテクノロジー製品は、特にワイヤレス接...

...

自動運転車における LiDAR とカメラセンサーの融合

センサーフュージョンは、自動運転車の重要な技術の 1 つです。これは、すべての自動運転車のエンジニア...