2014-03-07 34 views
3

我有一个非常大的代码,需要一些时间才能运行。为了确保进程没有停滞在某个地方,我打印屏幕上已经执行的代码的百分比,这取决于for循环和整数。跟踪和显示已执行代码的百分比

要显示已经处理的for循环的百分比,我使用标志来指示已经传递了多少循环。

MWE可能使更多一点明确:

import time 

N = 100 

flag_15, flag_30, flag_45, flag_60, flag_75, flag_90 = False, False,\ 
False, False, False, False 

for i in range(N): 

    # Large block of code. 
    time.sleep(0.1) 

    if i + 1 >= 0.15 * N and flag_15 is False: 
     print '15%' 
     flag_15 = True 
    elif i + 1 >= 0.3 * N and flag_30 is False: 
     print '30%' 
     flag_30 = True 
    elif i + 1 >= 0.45 * N and flag_45 is False: 
     print '45%' 
     flag_45 = True 
    elif i + 1 >= 0.6 * N and flag_60 is False: 
     print '60%' 
     flag_60 = True 
    elif i + 1 >= 0.75 * N and flag_75 is False: 
     print '75%' 
     flag_75 = True 
    elif i + 1 >= 0.9 * N and flag_90 is False: 
     print '90%' 
     flag_90 = True 
    elif i + 1 == N: 
     print '100%' 

这工作,但相当冗长,真正丑陋。我想知道是否可能有更好/更漂亮的方式来做到这一点。

+0

是重要的标志?难道你没有一个变量你增加和设置标志后? –

回答

1

(发布第二个答案,因为该解决方案采用的是完全不同的技术)

当完成百分比达到最低值,你可以创建里程碑值的列表,并打印一条消息。

milestones = [15, 30, 45, 60, 75, 90, 100] 
for i in range(N): 
    #do work here 
    percentage_complete = (100.0 * (i+1)/N) 
    while len(milestones) > 0 and percentage_complete >= milestones[0]: 
     print "{}% complete".format(milestones[0]) 
     #remove that milestone from the list 
     milestones = milestones[1:] 

结果:

15% complete 
30% complete 
45% complete 
60% complete 
75% complete 
90% complete 
100% complete 

与“跨越”的方法我在前面贴了,在这里你有过这百分比是打印的精确控制。它们不需要均匀分布,它们不需要被N整除,它们甚至不需要是整数!如果你愿意,你可以做milestones = [math.pi, 4.8, 15.16, 23.42, 99]

+0

这个人就像一个魅力,谢谢@Kevin! – Gabriel

3

我喜欢用模数来定期打印状态信息。

import time 

N = 100 
for i in range(N): 
    #do work here 
    if i % 15 == 0: 
     print "{}% complete".format(int(100 * i/N)) 
print "100% complete" 

结果:

0% complete 
15% complete 
30% complete 
45% complete 
60% complete 
75% complete 
90% complete 
100% complete 

超过100其他的N个值,如果你想打印每15%,你就必须动态地计算步幅,而不是仅仅使用字面值15值。

import time 
import math 

N = 300 
percentage_step = 15 
stride = N * percentage_step/100 
for i in range(N): 
    #do work 
    if i % stride == 0: 
     print "{}% complete".format(int(100 * i/N)) 
+0

这几乎可行,但它有一些问题。例如,如果我设置了“N = 10”和“percent_step = 25”,它将使用“20%”而不是“25%”的步骤。这可以解决吗? – Gabriel

+0

不是。由于10不能平均分为四个部分,所以步幅会稍微降低一点,并且会得到比其他情况更多的状态信息。 – Kevin

0

你不需要任何标志。您可以根据i的当前值打印完成。

for i in range(N): 
    # lots of code 

    print '{0}% completed.'.format((i+1)*100.0/N) 
+0

此语法仅适用于python 3+:http:// stackoverflow。com/questions/2456148/python-print-end – RickyA

+0

是;等待lemme转换成python 2 –

+0

这段代码让我无法控制应该显示的百分比步数。如果'N = 100'这将打印100行,这是不好的。 – Gabriel

2

可以使用写的组合()的flush()为漂亮的进度:

import sys 
import time 

for i in range(100): 
    row = "="*i + ">" 
    sys.stdout.write("%s\r%d%%" %(row, i + 1)) 
    sys.stdout.flush() 
    time.sleep(0.1) 

sys.stdout.write("\n") 

进度将显示如下:

69%====================================================================> 
+0

'flush'似乎不起作用。尝试用'Sublime'运行这个程序,并获得100条线,每条线都有一个更大的条。另一方面,它在从终端执行时的广告中起作用。 – Gabriel