Testowanie szybkości w Pythonie - Różnica czasu - milisekundy

136

Jaki jest właściwy sposób dwukrotnego porównania w Pythonie, aby przyspieszyć testowanie sekcji kodu? Próbowałem przeczytać dokumentację API. Nie jestem pewien, czy rozumiem kwestię timedelta.

Póki co mam taki kod:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here
BuddyJoe
źródło
15
Dlaczego nie wydrukowałeś t2-t1? Co cię powstrzymało od odejmowania?
S.Lott
18
Chyba miałam moment „to nie może być takie łatwe”.
BuddyJoe

Odpowiedzi:

191

datetime.timedelta to tylko różnica między dwoma datami ... więc jest to okres w dniach / sekundach / mikrosekundach

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

Należy pamiętać, że c.microsecondszwraca tylko część mikrosekund z timedelta! Do celów pomiaru czasu zawsze używaj c.total_seconds().

Za pomocą datetime.timedelta możesz wykonywać różne obliczenia matematyczne, np .:

>>> c / 10
datetime.timedelta(0, 0, 431654)

Bardziej przydatne może być spojrzenie na czas procesora zamiast na zegar ścienny ... jest to jednak zależne od systemu operacyjnego ... w systemach uniksopodobnych sprawdź polecenie „time”.

NickZoic
źródło
Każdy zainteresowany uzyskaniem całkowitej liczby minut może int(c.total_seconds() / 60)w tym przypadku skorzystać
sufinawaz
2
Strona dla modułu timeit mówi, że moduł „unika szereg wspólnych pułapek do pomiaru czasów wykonania.” Czy to podejście (przy użyciu datetime.now) podlega którejś z tych pułapek?
kuzzooroo,
@kuzzooroo tak, to jest! Lepiej byłoby użyć timeit zamiast tej metody! Na przykład mam test w dużym projekcie Pythona, który mierzony za pomocą tej metody daje przypuszczalny czas wykonania 0,25 s. W rzeczywistości i zgodnie z timeit, czas działania tej funkcji wynosi w rzeczywistości 30 sekund!
kazaamjt
62

Od Pythona 2.7 istnieje metoda timedelta.total_seconds (). Aby uzyskać liczbę milisekund, które upłynęły:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077
f.cipriani
źródło
20

Możesz również użyć:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

Lub możesz użyć profilerów Pythona .

Zitrax
źródło
1
Podczas używania start = time.clock()drukuje DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead.
Contango
16

Wiem, że jest późno, ale naprawdę lubię używać:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()daje sekundy od epoki. Ponieważ jest to ustandaryzowany czas w sekundach, możesz po prostu odjąć czas rozpoczęcia od czasu zakończenia, aby uzyskać czas procesu (w sekundach). time.clock()jest dobry do testów porównawczych, ale uważam, że jest to trochę bezużyteczne, jeśli chcesz wiedzieć, jak długo trwał Twój proces. Na przykład stwierdzenie „mój proces trwa 10 sekund” jest znacznie bardziej intuicyjne niż stwierdzenie „mój proces zajmuje 10 jednostek zegara procesora”

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

W pierwszym przykładzie powyżej pokazany jest czas 0,05 dla time.clock () w porównaniu z 0,06377 dla time.time ()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

W drugim przykładzie czas procesora pokazuje „0”, mimo że proces spał przez sekundę. time.time()poprawnie pokazuje trochę więcej niż 1 sekundę.

mgoldwasser
źródło
NameError: name 'time' nie jest zdefiniowana
Joe
Potrzebujesz import timeoświadczenia
mgoldwasser
5

Poniższy kod powinien wyświetlać detla czasu ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart
killy971
źródło
4

Możesz po prostu wydrukować różnicę:

print tend - tstart
sth
źródło
4

Nie jestem programistą Pythona, ale wiem, jak korzystać z Google i oto co znalazłem: używasz operatora „-”. Aby uzupełnić kod:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Ponadto wygląda na to, że możesz użyć funkcji strftime () do sformatowania obliczenia przedziału czasu w celu renderowania czasu, ale sprawia, że ​​jesteś szczęśliwy.

Mike C.
źródło
zobacz drugi komentarz na poziomie pytania.
BuddyJoe
14
„ale ja wiem, jak korzystać z Google” - najwyraźniej jednak nie wiesz, jak używać Stack Overflow, ponieważ celem tej witryny jest to, aby ludzie zadawali i odpowiadali na pytania programistyczne poprawnie i do rzeczy, a nie warknąć o tym, jak „zamiast tego mogłeś go oszukać”.
Hejazzman
2

time.time () / datetime jest dobre do szybkiego użycia, ale nie zawsze jest w 100% dokładne. Z tego powodu lubię używać jednego z standardowych profilów lib (szczególnie hotshot), aby dowiedzieć się, co jest.

nilamo
źródło
2

Możesz zajrzeć do modułów profilu . Uzyskasz dokładniejszy odczyt lokalizacji spowolnień, a większość Twojej pracy będzie w pełni zautomatyzowana.

Stefan Kendall
źródło
2

Oto niestandardowa funkcja, która naśladuje funkcje Matlaba / Octave tic toc.

Przykład użycia:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

Funkcja:

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()
Ulad Kasach
źródło
Traceback (ostatnie połączenie): plik "redis-get-response.py", wiersz 22, w <module> time_var = time_me (); # pobierz zmienną z aktualnym znacznikiem czasu Plik "redis-get-response.py", wiersz 20, w time_me return time.time () NameError: nazwa 'time' nie jest zdefiniowana
Joe
0

Możesz użyć timeit w ten sposób do przetestowania skryptu o nazwie module.py

$ python -mtimeit -s 'import module'
Dhiraj Thakur
źródło
0

Strzałka: Lepsze daty i godziny dla Pythona

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
Eds_k
źródło