1

プログラムが完了するまでにかかる時間を見積もる方法が必要です。現在、ネストされた for ループでほとんどの時間を費やしています。処理された出力ファイルを取得するのにかかる時間を把握するために、この for ループ内で何回の反復が発生したかを確認したいと考えています。Python で % done をファイルに出力する方法はありますか?

これが私の現在のアプローチですが、進行状況ファイルを読み取ろうとすると、常に空になります。ファイルを閉じることで、何が書かれているかを確認できると思いました。

 48     #Estimate finishing time
 49     progTotal = len(f1)
 50     prog = 0
 51
 52     #Now to calculate 1st order Walsh Coefficients by subtracting away 2nd order coefficients
 53     for g in f1:
 54         progFile = open("progress",'w')
 55         sumOfOtherWalsh = 0
 56         for gPair in w2:
 57             if g == gPair[0] or g == gPair[1]:
 58                 sumOfOtherWalsh += w2.get(gPair, 0) #Add the walsh value into sum, if it is there
 59         f1[g] -= sumOfOtherWalsh #subtract all the Walsh values as well as the value in f1
 60         progFile.write(str(float(prog)/progTotal)+"\n")
 61         prog += 1
 62         progFile.close()

驚いたことに、ここでこれに関する情報を見つけることができなかったので、間違っていると思いますが、とにかく助けてくれてありがとう.

4

1 に答える 1

5

計算の進行状況を stdout に表示するには、 progressbarモジュールを使用できます。

例:

import time
import progressbar

maxval = 100
pbar = progressbar.ProgressBar(maxval=maxval)
pbar.start()
for i in range(maxval):
    # do something
    time.sleep(0.05)
    pbar.update(i+1)
pbar.finish()

出力:

$ python test.py
52% |#####################################                                    |

ファイルへの出力の取得に関しては、出力を表示するためにファイルを閉じる必要はありませんが、出力バッファーをフラッシュする必要があります。(実際、ループの本体でファイルを繰り返し開いたり、切り捨てたりするのは非効率的であり、おそらく逆効果です。)

ファイル オブジェクトのフラッシュと、ファイルの内容をディスクにフラッシュするための os モジュールの fsyncメソッドを見てください。ただし、これは通常は必要ありません。ファイルに十分なデータを書き込むと、バッファは端末に出力できる速さでフラッシュされます。(通常tail -f progess_fileは問題なく出力できます。)

達成したいことをログに記録している場合は、logging モジュールを見てください。これを使用して、拡張可能な優れたロギング システムを取得できます。ファイルまたは stdout へのロギングをコード内の 1 点で行うかどうかを選択できます。メインロガーを名前で「取得」するだけで、他のモジュールのロギングアクティビティを同じログに添付できます。

logger = logging.getLogger("__main__")

(または、別の名前を使用して別のロガーを設定することもできます。)

例:

import time
import logging

# set up the logging
def setup_logger(logfilename = None):
    logger = logging.getLogger(__name__) # probably __name__ == "__main__" 
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
    if logfilename:
        # write to logfile
        handler = logging.FileHandler(logfilename)
    else:
        # write to stdout
        handler = logging.StreamHandler()
    handler.setFormatter(formatter)
    logger.addHandler(handler)
    return logger
logger = setup_logger("test.log")

# example use of the logger
maxval = 100
for i in range(1,maxval+1):
    # do something
    time.sleep(0.05)
    if (i)%(maxval/10) == 0:
        logger.debug("progress:% 4d %% done", i)

出力:

2013-05-15 21:03:23,313 - DEBUG - progress:  10 % done
2013-05-15 21:03:23,822 - DEBUG - progress:  20 % done
2013-05-15 21:03:24,323 - DEBUG - progress:  30 % done
2013-05-15 21:03:24,825 - DEBUG - progress:  40 % done
2013-05-15 21:03:25,326 - DEBUG - progress:  50 % done
2013-05-15 21:03:25,827 - DEBUG - progress:  60 % done
2013-05-15 21:03:26,328 - DEBUG - progress:  70 % done
2013-05-15 21:03:26,829 - DEBUG - progress:  80 % done
2013-05-15 21:03:27,330 - DEBUG - progress:  90 % done
2013-05-15 21:03:27,831 - DEBUG - progress: 100 % done
于 2013-05-15T18:35:13.640 に答える