完成长时间运行的Python任务的完成百分比

问题描述:

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

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 

这里,所属分类拥有约20000项,和df是具有(比如说)500万行的大型数据帧。

我不寻找任何幻想(如进度条..)。只是比例完整的价值。有任何想法吗?

谢谢!

+0

可能是[Python Progress Bar](http://*.com/questions/3160699/python-progress-bar) – dodell

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

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()声明。

天真的解决办法是只使用行的总金额在你的数据集和你是在索引,然后计算的进展:

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

+0

的重复!一些子集将会更快,有些将需要更长的时间。我看到了进度条......而且我的直觉告诉他们他们也会有类似的表现。不过,我现在会仔细查看进度条。 – user1717931