Python 跟踪并显示已执行代码的百分比

Python 跟踪并显示已执行代码的百分比,python,Python,我有一个非常大的代码,需要一些时间来运行。为了确保进程没有在某个地方停止,我打印以筛选已执行代码的百分比,这取决于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):

我有一个非常大的代码,需要一些时间来运行。为了确保进程没有在某个地方停止,我打印以筛选已执行代码的百分比,这取决于
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%'

这是可行的,但相当冗长,确实丑陋。我想知道是否有更好/更漂亮的方法来实现这一点。

我喜欢使用模数定期打印状态消息

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
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))

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

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

    print '{0}% completed.'.format((i+1)*100.0/N)
(发布第二个答案,因为此解决方案使用了完全不同的技术)

您可以创建里程碑值列表,并在完成百分比达到最低值时打印消息

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:]
结果:

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

与我之前发布的“跨步”方法不同,这里您可以精确控制打印的百分比。它们不需要等距,不需要被N整除,甚至不需要是整数!如果需要,您可以执行
里程碑=[math.pi,4.8,15.16,23.42,99]

您可以将write()和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%====================================================================>
import sys
import time

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

sys.stdout.write("\n")
只需在Misha的答案中添加一个“\r”:

import sys
import time

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

sys.stdout.write("\n")
输出:

65%======================================================>
在colab.research.google.com中,工作原理如下:

    69%====================================================================>
import sys
import time

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

sys.stdout.write("\n")

旗帜重要吗?您不能增加一个变量并稍后设置标志吗?此语法仅适用于Python3+:Yes;wait lemme convert to python 2此代码无法控制应显示的百分比步长。如果
N=100
这将打印100行,这是不好的。这几乎可以工作,但有一些问题。例如,如果我设置
N=10
percentage\u step=25
,它将使用
20%
的步骤,而不是
25%
。这能解决吗?不太可能。由于10不能平均分为四个部分,因此步幅会稍微降低,并且您会比其他情况多收到一条状态消息。
flush
似乎不起作用。试着用
Sublime
运行这个程序,得到了100行,每行都有一个更大的条。Add:另一方面,当从终端执行时,它的工作方式与公布的一样。