Je voudrais mesurer le temps d'exécution d'un morceau de code en jours , heures, minutes et secondes. Voici ce que j'ai jusqu'à présent:

import time
start_time = time.time()

# some code

elapsed = time.strftime("%H:%M:%S", time.gmtime(time.time() - start_time))
print(f"Took: {elapsed}")

Le problème est que si le code que je mesure prend plus de 24h, l'heure affichée déborde et recommence à zéro. J'aimerais quelque chose comme ça:

# Example: 12 hours and 34 minutes should be printed as 
> Took: 12:34:00

# Example: 26 hours and 3 minutes should be printed as 
> Took: 1:02:03:00
-1
r0f1 4 juin 2020 à 18:15

5 réponses

Meilleure réponse

Vous pouvez utiliser datetime:

from datetime import datetime as dt

start = dt.fromtimestamp(1588432670)
end = dt.now()
elapsed=end-start
print("Took: %02d:%02d:%02d:%02d" % (elapsed.days, elapsed.seconds // 3600, elapsed.seconds // 60 % 60, elapsed.seconds % 60))

Production:

Took: 33:00:21:49
1
Maurice Meyer 4 juin 2020 à 15:40

Les types de temps ne peuvent inclure que des heures et moins d'unités. Vous devez utiliser datetime au lieu de time comme suit:

from datetime import datetime
start_time = datetime.now()

# some code

elapsed = datetime.now() - start_time)
print(f"Took: {elapsed}")

Exemple d'utilisation de Datetime:

from datetime import datetime
d1 = datetime(2013,9,1,5,5,4)
d2 = datetime(2013,1,13,3,2,1)
result1 = d1-d2
print ('{} between {} and {}'.format(result1, d1, d2))

Cela produit la sortie suivante:

231 days, 2:03:03 between 2013-09-01 05:05:04 and 2013-01-13 03:02:01
5
User5 4 juin 2020 à 15:34

Le résultat de time.gmtime(time.time() - start_time) n'est pas ce que vous semblez penser. Au lieu d'être une durée, c'est un point dans le temps. Laisse-moi expliquer.

Le résultat de time.time() est le nombre de secondes depuis le 1er janvier 1970 à 00:00:00 (UTC) au moment de l'appel. Par conséquent, l'instruction time.time() - start_time produira le nombre de secondes entre les deux appels. Jusqu'ici tout va bien. Cependant, la fonction time.gmtime interprète cela durée comme le nombre de secondes depuis le 1er janvier 1970 à 00:00:00 (UTC) et formatage de l'heure en conséquence. Ce que vous voyez alors est la partie horaire de la date du 1er janvier 1970 à 12:34:00 (UTC).

Je vous suggère d'utiliser l'objet datetime.timedelta et formater en utilisant cela, ou comme d'autres l'ont suggéré, afficher la durée en secondes ou millisecondes.

Si vous souhaitez formater ce nombre vous-même, vous pouvez utiliser quelque chose comme ceci:

def format_duration(duration):
    mapping = [
        ('s', 60),
        ('m', 60),
        ('h', 24),
    ]
    duration = int(duration)
    result = []
    for symbol, max_amount in mapping:
        amount = duration % max_amount
        result.append(f'{amount}{symbol}')
        duration //= max_amount
        if duration == 0:
            break

    if duration:
        result.append(f'{duration}d')

    return ' '.join(reversed(result))
1
Kendas 4 juin 2020 à 15:40

Essayez d'utiliser timeit

import timeit
timeit.timeit(<callable function>, number = 100)

Ici, timeit appellera callable function number fois et vous donnera le temps d'exécution moyen.

1
Prashant Negi 4 juin 2020 à 15:21

Vous devriez essayer ça.

import time
start_time = time.time()
...
elapsed_time = time.time() - start_time
days = 0
if elapsed_time >= 86400:
    days = int(elapsed_time / 86400)
elapsed = time.strftime("%H:%M:%S", time.gmtime(time.time() - start_time))
if days == 0:
    print(f"Took: {elapsed}")
else:
    print(f"Took: {days}:{eplased}")
2
Metalgear 4 juin 2020 à 15:25