Calculating the amount of time left until completion

Question:

I am wondering how to calculate the amount of time it would take to example:

Complete a brute force word list.

I know how to use the time function and measure in time,
but the problem is i need to find out how long it would take in the program itself…

Here is the code i made this yesterday

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: %rtPercentage: %r/100tAmount left: %r" % (i, int(percentage), amount)
        if i == '0'* range_num:
            print "*Done"
            f.close()
            exit(0)
        else:
            pass

This is my timer function i managed to make

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

print "This is the timernHit CTRL-C to stop the timernOtherwise 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 continuenHit CTRL-C to end")
        try:
            pass

        except KeyboardInterrupt:
            exit(0)

Now i just cant figure out how to make this again but to calculate how long it will take rather than how long it is taking…

Asked By: Evil Exists

||

Answers:

You cannot predict the time a script is going to take.
Firstly because two machines wouldn’t run the script in the same time, and secondly, because the execution time on one machine can vary from on take to another.

What you can do, however, is compute the percentage of execution.
You need to figure out, for example, how many iterations your main loop will do, and calculate at each iteration the ratio current iteration count / total number of iterations.

Here is a minimalist example of what you can do:

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

You can take it further and add the time as an additional info:

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

The output will look like this:

...
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%)
Answered By: Right leg

You will never ever be able to know exactly how long it is going to take to finish. The best you can do is calculate was percentage of the work you have finished and how long that has taken you and then project that out.

For example if you are doing some work on the range of numbers from 1 to 100 you could do something such as

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)

Please understand that the above is largely pseudo-code

Answered By: Nick Chapman

The following function will calculate the remaining time:

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"

The parameters are:

  • i : The current iteration
  • total : the total number of iterations
  • time : the duration of the last iteration

It uses the average time taken by the last 5 iterations to calculate the remaining time. You can the use it in your code as follows:

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)
Answered By: H4dr1en

This is my implementation, which returns time elapsed, time left, and finish time in H:M:S format.

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)

Example:

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)

Output:

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
....
Answered By: Mehdi

You can’t really tell how much time is left for sure (as stated above). However; you could keep a running count of files processed and a total time taken on files, average them, and assume that the file will take the average time.

You could take it a bit further and do blocks … files in this range on average took x time and files in this size range took x time, etc.. This could make it a bit more accurate, but outside of that there isn’t really a way unfortunately.

Answered By: Taux1c
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.