1

我需要一种方法来估计我的程序需要多长时间才能完成。它目前大部分时间都花在嵌套的 for 循环中。我希望看看这个 for 循环中发生了多少次迭代,以了解获得处理后的输出文件需要多长时间。有没有办法将完成的百分比输出到python中的文件?

这是我目前的方法,但是当我尝试读取进度文件时,它总是空的。我想通过关闭文件,我将能够看到已写入的内容。

 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

至于将计算进度显示到标准输出,您可以使用进度条模块。

例子:

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 模块。您可以使用它来获得一个很好的可扩展日志系统。您可以选择是否在代码中的单个点将日志记录到文件或标准输出。您只需按名称“获取”主记录器,即可将其他模块的日志记录活动附加到同一日志:

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 回答