长期运行的python任务完成百分比

时间:2016-09-15 14:01:08

标签: python

我有一个python程序,它使用Pandas来处理大型数据集。目前大约需要15分钟才能完成。我想记录(stdout&发送指标到Datadog)有关任务进度的信息。有没有办法获得任务(或函数)的%完成?将来,我可能会处理更大的数据集。我正在做的Python任务是对大型pandas数据框的简单分组。像这样:

dfDict = {}
for cat in categoryList:
    df1 = df[df['category'] == cat]
    if len(df1.index) > 0:
        df1[dateCol] = pd.to_datetime(df[dateCol])
        dfDict[cat] = df1

这里,categoryList有大约20000个项目,而df是一个大数据框,有(例如)500万行。

我不是在寻找任何花哨的东西(比如进步吧......)。只是完成百分比值。有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以根据需要修改以下内容。

from time import sleep

for i in range(12):
    sleep(1)
    print("\r\t> Progress\t:{:.2%}".format((i + 1)/12), end='')

这基本上做的是,它阻止print()编写默认结束字符(end=''),同时在任何事情之前编写回车符('\r')其他。简单来说,您将覆盖之前的print()语句。

答案 1 :(得分:0)

天真的解决方案是只使用数据集中的总行数和您所在的索引,然后计算进度:

size = len(dataset)
for index, element in enumerate(dataset):
    print(index / size * 100)

如果每行需要大约相同的时间才能完成,那么这只会有些可靠。因为你有一个大的数据集,它可能会随着时间的推移而平均,但是如果某些行需要一毫秒,而另一行需要10分钟,那么百分比将是垃圾。

还考虑将百分比四舍五入为一位小数:

size = len(dataset)
for index, element in enumerate(dataset):
    print(round(index / size * 100), 1)

每行打印可能会大大降低您的任务速度,因此请考虑以下改进:

size       = len(dataset)
percentage = 0
for index, element in enumerate(dataset):
    new_percentage = round(index / size * 100), 1)
    if percentage != new_percentage:
        percentage = new_percentage
        print(percentage)

当然,还有以下模块:

progressbar

progress