计算完成前剩余的时间

时间:2017-07-05 12:19:58

标签: python time

我想知道如何计算示例所需的时间:

  

填写暴力单词列表。

我知道如何使用时间功能并及时测量, 但问题是我需要知道程序本身需要多长时间......

以下是我昨天制作的代码

import itertools, math
import os
Alphabet = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890") # Add or remove whatevs you think will be in the password you're cracking (example, [symbols])
counter = 1
CharLength = 1
range_num = int(raw_input("Enter range: "))
stopper = range_num + 1
filename = "bruteforce_%r.txt" % (range_num)
f = open(filename, 'a')
#n_1 = len(Alphabet)
#n_2 = n_1 - 1 # <-- total useless peice of garbage that could of been great in vurtual life
#n_3 = '0' * n_2
#n = '1' + n_3
x = range_num
y = len(Alphabet)
amount = math.pow(y, x)
total_items = math.pow(y, x)
for CharLength in range(range_num, stopper):
    passwords = (itertools.product(Alphabet, repeat = CharLength))

    for i in passwords:
        counter += 1
        percentage = (counter / total_items) * 100
        amount -= 1
        i = str(i)
        i = i.replace("[", "")
        i = i.replace("]", "")
        i = i.replace("'", "")
        i = i.replace(" ", "")
        i = i.replace(",", "")
        i = i.replace("(", "")
        i = i.replace(")", "")
        f.write(i)
        f.write('\n')
        print "Password: %r\tPercentage: %r/100\tAmount left: %r" % (i, int(percentage), amount)
        if i == '0'* range_num:
            print "*Done"
            f.close()
            exit(0)
        else:
            pass

这是我设法制作的计时器功能

#import winsound # Comment this out if your using linux
import os 
import time
from sys import exit

print "This is the timer\nHit CTRL-C to stop the timer\nOtherwise just let         it rip untill the time's up"
hours = int(raw_input('Enter the hours.\n>>> '))
os.system('clear') # Linux
#os.system('cls')   # Windows

minutes = int(raw_input('Enter the minutes.\n>>> '))
os.system('clear') # linux
#os.system('cls')   # Windows

seconds = int(raw_input('Enter the seconds.\n>>> '))
os.system('clear') # Linux
#os.system('cls')   # Windows

stop_time = '%r:%r:%r' % (hours, minutes, seconds)

t_hours = 00
t_minutes = 00
t_seconds = 00

while t_seconds <= 60:
    try:
        os.system('clear') # Linux
        #os.system('cls') # Windows
        current_time = '%r:%r:%r' % (t_hours, t_minutes, t_seconds)
        print current_time
        time.sleep(1)
        t_seconds+=1

        if current_time == stop_time:
            print "// Done"
            #winsound.Beep(500,1000)
            #winsound.Beep(400,1000)
            break

        elif t_seconds == 60:
            t_minutes+=1
            t_seconds=0

        elif t_minutes == 60:
            t_hours+=1
            t_minutes = 00

    except KeyboardInterrupt:
        print "Stopped at: %r:%r:%r" % (t_hours, t_minutes, t_seconds)
        raw_input("Hit enter to continue\nHit CTRL-C to end")
        try:
            pass

        except KeyboardInterrupt:
            exit(0)

现在我只是想弄清楚如何重新制作它,但计算需要多长时间而不是花多长时间......

4 个答案:

答案 0 :(得分:3)

您无法预测脚本的播放时间。 首先是因为两台机器不能在同一时间运行脚本,其次,因为一台机器上的执行时间可能会有所不同。

然而,您可以做的是计算执行的百分比。 例如,您需要弄清楚主循环将执行多少次迭代,并在每次迭代时计算比率current iteration count / total number of iterations

以下是您可以做的最简单示例:

n = 10000
for i in range(n):
    print("Processing file {} ({}%)".format(i, 100*i//n))
    process_file(i)

您可以进一步了解并添加时间作为附加信息:

n = 10000
t0 = time.time()
for i in range(n):
    t1 = time.time()
    print("Processing file {} ({}%)".format(i, 100*i//n), end="")
    process_file(i)
    t2 = time.time()
    print(" {}s (total: {}s)".format(t2-t1, t2-t0))

输出将如下所示:

...
Processing file 2597 (25%) 0.2s (total: 519.4s)
Processing file 2598 (25%) 0.3s (total: 519.7s)
Processing file 2599 (25%) 0.1s (total: 519.8s)
Processing file 2600 (25%)

答案 1 :(得分:1)

你永远无法确切地知道要花多长时间才能完成。你能做的最好的事情就是计算你完成的工作的百分比以及你花了多长时间然后将它投射出去。

例如,如果你正在做一些从1到100的数字范围的工作,你可以做一些事情,如

start_time = get the current time
for i in range(1, 101):
    # Do some work
    current_time = get the current time
    elapsed_time = current_time - start_time
    time_left = 100 * elapsed_time / i - elapsed_time
    print(time_left)

请理解以上内容主要是伪代码

答案 2 :(得分:0)

以下功能将计算剩余时间:

last_times = []
def get_remaining_time(i, total, time):
    last_times.append(time)
    len_last_t = len(last_times)
    if len_last_t > 5:
        last_times.pop(0)
    mean_t = sum(last_times) // len_last_t 
    remain_s_tot = mean_t * (total - i + 1) 
    remain_m = remain_s_tot // 60
    remain_s = remain_s_tot % 60
    return f"{remain_m}m{remain_s}s"

参数为:

  • i:当前迭代
  • total:迭代总数
  • time:最后一次迭代的持续时间

它使用最后5次迭代所花费的平均时间来计算剩余时间。您可以按如下所示在代码中使用它:

last_t = 0
iterations = range(1,1000)
for i in iterations:
    t = time.time()

    # Do your task here        

    last_t = time.time() - t
    get_remaining_time(i, len(iterations), last_t)

答案 3 :(得分:0)

这是我的实现,它以H:M:S格式返回经过的时间,剩余时间和结束时间。

def calcProcessTime(starttime, cur_iter, max_iter):

    telapsed = time.time() - starttime
    testimated = (telapsed/cur_iter)*(max_iter)

    finishtime = starttime + testimated
    finishtime = dt.datetime.fromtimestamp(finishtime).strftime("%H:%M:%S")  # in time

    lefttime = testimated-telapsed  # in seconds

    return (int(telapsed), int(lefttime), finishtime)

示例:

import time
import datetime as dt

start = time.time()
cur_iter = 0
max_iter = 10

for i in range(max_iter):
    time.sleep(5)
    cur_iter += 1
    prstime = calcProcessTime(start,cur_iter ,max_iter)
    print("time elapsed: %s(s), time left: %s(s), estimated finish time: %s"%prstime)

输出:

time elapsed: 5(s), time left: 45(s), estimated finish time: 14:28:18
time elapsed: 10(s), time left: 40(s), estimated finish time: 14:28:18
time elapsed: 15(s), time left: 35(s), estimated finish time: 14:28:18
....