2

長時間実行される python スクリプトのプロファイルを作成しようとしています。このスクリプトは、 gdal モジュールを使用して、ラスター GIS データ セットに対していくつかの空間分析を行います。スクリプトは現在 3 つのファイルを使用します。メイン スクリプトは と呼ばれるラスター ピクセルをループ処理しfind_pixel_pairs.py、単純なキャッシュは にlrucache.pyあり、いくつかのその他のクラスは にありutils.pyます。中程度のサイズのデータ​​セットでコードをプロファイリングしました。 pstats戻り値:

   p.sort_stats('cumulative').print_stats(20)
   Thu May  6 19:16:50 2010    phes.profile

   355483738 function calls in 11644.421 CPU seconds

   Ordered by: cumulative time
   List reduced from 86 to 20 due to restriction <20>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.008    0.008 11644.421 11644.421 <string>:1(<module>)
        1 11064.926 11064.926 11644.413 11644.413 find_pixel_pairs.py:49(phes)
340135349  544.143    0.000  572.481    0.000 utils.py:173(extent_iterator)
  8831020   18.492    0.000   18.492    0.000 {range}
   231922    3.414    0.000    8.128    0.000 utils.py:152(get_block_in_bands)
   142739    1.303    0.000    4.173    0.000 utils.py:97(search_extent_rect)
   745181    1.936    0.000    2.500    0.000 find_pixel_pairs.py:40(is_no_data)
   285478    1.801    0.000    2.271    0.000 utils.py:98(intify)
   231922    1.198    0.000    2.013    0.000 utils.py:116(block_to_pixel_extent)
   695766    1.990    0.000    1.990    0.000 lrucache.py:42(get)
  1213166    1.265    0.000    1.265    0.000 {min}
  1031737    1.034    0.000    1.034    0.000 {isinstance}
   142740    0.563    0.000    0.909    0.000 utils.py:122(find_block_extent)
   463844    0.611    0.000    0.611    0.000 utils.py:112(block_to_pixel_coord)
   745274    0.565    0.000    0.565    0.000 {method 'append' of 'list' objects}
   285478    0.346    0.000    0.346    0.000 {max}
   285480    0.346    0.000    0.346    0.000 utils.py:109(pixel_coord_to_block_coord)
      324    0.002    0.000    0.188    0.001 utils.py:27(__init__)
      324    0.016    0.000    0.186    0.001 gdal.py:848(ReadAsArray)
        1    0.000    0.000    0.160    0.160 utils.py:50(__init__)

上位 2 つの呼び出しには、メイン ループ (分析全体) が含まれています。残りの呼び出しの合計は、11644 秒のうち 625 未満です。残りの 11,000 秒はどこで費やされますか? それはすべてのメインループ内にありfind_pixel_pairs.pyますか? もしそうなら、コードのどの行が最も多くの時間を費やしているかを調べることはできますか?

4

4 に答える 4

1

機能と測定を忘れてください。このテクニックを使用してください。デバッグモードで実行し、ctrl-C を数回実行するだけです。コール スタックは、時間の原因となっているコード行を正確に示します。

追加: たとえば、10 回一時停止します。EOL が言うように、11000 秒のうち 10400 秒が で直接費やされている場合、それらの一時停止のうち約 9 回で、そこでphes停止します。一方、から呼び出されたサブルーチンでかなりの時間を費やしている場合は、そのサブルーチンのどこにあるかを確認するだけでなく、それを呼び出している行も確認できます。時間など、呼び出しスタックをアップします。phes

測定しないでください。捕獲。

于 2010-05-06T13:22:28.393 に答える
1

phesほとんどの時間がの 49 行目の関数で費やされていることは間違いありませんfind_pixel_pairs.py。詳細を調べるには、phesさらにサブ関数に分割してから、再プロファイルする必要があります。

于 2010-05-06T11:01:54.210 に答える
0

各関数またはメソッドのコード実行に費やされた時間は、tottime列にあります。cumtimeメソッドは、tottime呼び出された関数で費やされた時間です。

リストでは、探している 11,000 秒がphes関数自体によって直接費やされていることがわかります。それが呼び出すものは約600秒しかかかりません。

phesしたがって、 ~unutbu が提案したように、サブ関数に分割して再プロファイリングすることにより、 で時間がかかるものを見つけたいと考えています。

于 2010-05-06T11:31:29.440 に答える