Jak uzyskać czas na wykonanie programu w języku Python?

975

Mam program wiersza polecenia w języku Python, którego ukończenie zajmuje trochę czasu. Chcę wiedzieć, ile czasu zajmuje ukończenie biegu.

Patrzyłem na timeitmoduł, ale wygląda na to, że dotyczy tylko małych fragmentów kodu. Chcę zmierzyć czas całego programu.

john2x
źródło

Odpowiedzi:

1719

Najprostszy sposób w Pythonie:

import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))

Zakłada się, że uruchomienie programu zajmuje co najmniej jedną dziesiątą sekundy.

Wydruki:

--- 0.764891862869 seconds ---
rogeriopvl
źródło
58
oblicza to jednak czas rzeczywisty (w tym czas wykorzystywany przez inne programy), więc zajmie to więcej czasu, gdy komputer będzie zajęty robieniem innych rzeczy
newacct
35
w systemie Windows zrób to samo, ale użyj time.clock () zamiast time.time (). Otrzymasz nieco lepszą celność.
Corey Goldberg,
33
Polecam robić round(time.time() - start_time, 2)(lub cokolwiek chcesz dziesiętnie), odzyskiwałem liczby naukowe jak 1,24e-5.
ThorSummoner
16
@ThorSummoner: prawdopodobnie chcesz '%.2f'zamiast round()tutaj.
jfs
10
W tej metodzie jest duża wada. Jeśli czas systemowy zmienia się podczas działania programu (np. Synchronizacja z serwerem czasu), wówczas ta metoda nie będzie działać, a nawet może złamać kod (ujemny czas trwania ...)
Gilad
210

Umieszczam ten timing.pymoduł w swoim własnym site-packageskatalogu i po prostu wstawiam import timingu góry mojego modułu:

import atexit
from time import clock

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print line
    print secondsToStr(clock()), '-', s
    if elapsed:
        print "Elapsed time:", elapsed
    print line
    print

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

start = clock()
atexit.register(endlog)
log("Start Program")

Mogę również dzwonić timing.logz poziomu mojego programu, jeśli w programie chcę pokazać znaczące etapy. Ale samo włączenie import timingspowoduje wydrukowanie czasu rozpoczęcia i zakończenia oraz ogólnego czasu, który upłynął. (Wybacz mi moją niejasną secondsToStrfunkcję, po prostu formatuje zmiennoprzecinkową liczbę sekund do postaci hh: mm: ss.sss.)

Uwaga: Wersja powyższego kodu w języku Python 3 można znaleźć tutaj lub tutaj .

PaulMcG
źródło
8
To jest naprawdę czyste rozwiązanie, które działa również po naciśnięciu Ctrl-C, aby zatrzymać program.
sorin
świetne rozwiązanie Zdecydowanie go
użyję i stworzę
9
W przypadku Python 3 dodaj from functools import reduceu góry i umieść nawiasy wokół każdej instrukcji print. Działa świetnie!
PowerApp101
2
@ PowerApp101 - Dzięki - odpowiedź Nicojo zapewnia przyjazną Py3 wersję tego modułu.
PaulMcG,
4
Uwaga: time.clock () jest „Przestarzałe od wersji 3.3: Zachowanie tej funkcji zależy od platformy: użyj perf_counter () [z czasem przespanym] lub process_time () [bez czasu przespanego] zamiast tego, w zależności od wymagań, aby mieć dobrze określone zachowanie ”.
mab
175

W systemie Linux lub Unix:

$ time python yourprogram.py

W systemie Windows zobacz to pytanie StackOverflow: Jak zmierzyć czas wykonania polecenia w wierszu polecenia systemu Windows?

Aby uzyskać bardziej szczegółowe dane wyjściowe,

$ time -v python yourprogram.py
    Command being timed: "python3 yourprogram.py"
    User time (seconds): 0.08
    System time (seconds): 0.02
    Percent of CPU this job got: 98%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.10
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 9480
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 1114
    Voluntary context switches: 0
    Involuntary context switches: 22
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
steveha
źródło
więc jeśli uruchamiam inny widżet, na przykład w aplikacji QT, w jaki sposób obliczamy czas potrzebny na pojawienie się tego widżetu?
Ciasto piekarz
1
W przypadku widżetu, jeśli uruchamiasz z programu Python, użyj zaakceptowanej odpowiedzi przez rogeriopvl.
steveha,
ale to nie wydaje się dać czasu w min: sekundach kończy się liczbą zmiennoprzecinkową !!
Ciasto piekarz
3
Tak, daje liczbę sekund. Jeśli chcesz, możesz przeliczyć na min: sekundy. Spójrz na odpowiedź Paula McGuire'a i jego secondsToStr()funkcję.
steveha,
68

Naprawdę podoba mi się odpowiedź Paula McGuire'a , ale używam Pythona 3. Dla tych, którzy są zainteresowani: oto modyfikacja jego odpowiedzi, która działa z Pythonem 3 na * nix (wyobrażam sobie, pod Windowsem, że clock()powinno się go użyć time()):

#python3
import atexit
from time import time, strftime, localtime
from datetime import timedelta

def secondsToStr(elapsed=None):
    if elapsed is None:
        return strftime("%Y-%m-%d %H:%M:%S", localtime())
    else:
        return str(timedelta(seconds=elapsed))

def log(s, elapsed=None):
    line = "="*40
    print(line)
    print(secondsToStr(), '-', s)
    if elapsed:
        print("Elapsed time:", elapsed)
    print(line)
    print()

def endlog():
    end = time()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

start = time()
atexit.register(endlog)
log("Start Program")

Jeśli uznasz to za przydatne, powinieneś nadal głosować na jego odpowiedź zamiast tej, ponieważ wykonał większość pracy;).

Nicojo
źródło
1
Byłem timedelta(seconds=t).total_seconds()pomocny.
czwartek
Czy możesz wyjaśnić, jakie funkcje pełnią te funkcje? co jest w poleceniu log? co to jest atexit?
SumNeuron,
@SumNeuron, w skrócie, funkcje te drukują czas wykonania programu, z którym go używasz. s jest pierwszym argumentem do zarejestrowania i powinien być ciągiem. log jest funkcją, która drukuje informacje o taktowaniu. atexit to moduł pythona, który pozwala rejestrować funkcje, które mają być wywoływane przy wyjściu z programu.
Nicojo,
@Nicojo Bardzo pomocny. Mam pytanie, w jaki sposób mogę użyć tego kodu do przetestowania na przykład czasu wykonania pętli. przypuśćmy, że mam funkcję włączającą pętlę i chcę uzyskać czas spędzony przez tę pętlę
moudi,
@moudi Najlepsza odpowiedź na to pytanie jest najlepszym wyborem. Wystarczy ustawić czas rozpoczęcia tuż przed zapętleniem i obliczyć upływ czasu na wyjściu z pętli.
Nicojo
67
import time

start_time = time.clock()
main()
print time.clock() - start_time, "seconds"

time.clock()zwraca czas procesora, co pozwala nam obliczyć tylko czas wykorzystany przez ten proces (w każdym razie na Uniksie). Dokumentacja mówi „w każdym razie jest to funkcja używana do testowania porównawczego Pythona lub algorytmów czasowych”

newacct
źródło
14
time.time () najlepiej stosować na * nix. time.clock () najlepiej stosować w systemie Windows.
Corey Goldberg,
Uważam, że nie można tego użyć do obliczenia „tylko czasu wykorzystanego przez ten proces”, ponieważ wykorzystuje on czas systemowy i będzie miał wpływ na inne procesy systemowe? Popraw mnie, jeśli się mylę :)
AnnanFay,
6
Uwaga: time.clock () jest „Przestarzałe od wersji 3.3: Zachowanie tej funkcji zależy od platformy: użyj perf_counter () [z czasem przespanym] lub process_time () [bez czasu przespanego] zamiast tego, w zależności od wymagań, aby mieć dobrze określone zachowanie ”.
mab
55

Podoba mi się wynik dostarczany przez datetimemoduł, w którym obiekty delta czasowej pokazują dni, godziny, minuty itp. W razie potrzeby w sposób czytelny dla człowieka.

Na przykład:

from datetime import datetime
start_time = datetime.now()
# do your work here
end_time = datetime.now()
print('Duration: {}'.format(end_time - start_time))

Przykładowy wynik np

Duration: 0:00:08.309267

lub

Duration: 1 day, 1:51:24.269711

Jak wspomniał JF Sebastian, takie podejście może napotkać pewne trudne przypadki z czasem lokalnym, więc bezpieczniej jest używać:

import time
from datetime import timedelta
start_time = time.monotonic()
end_time = time.monotonic()
print(timedelta(seconds=end_time - start_time))
metakermit
źródło
1
@phansen: możesz użyć timedelta(seconds=time.monotonic()-start)tutaj (lub time.time()jeśli interwał jest duży). Nie odejmuj naiwnych obiektów daty i godziny reprezentujących czas lokalny; czas lokalny nie jest monotonna
jfs
OK, masz na myśli jak start_time = time.monotonic(); end_time = time.monotonic(); timedelta(seconds=end_time - start_time). Ufam, że masz rację, ale musisz też ją sformatować, gdy wrócisz datetime.timedelta(0, 0, 76). Wygląda też na to, że monotoniczna metoda została dodana tylko w Pythonie 3.
metakermit
Ach, okej. Widzę, że możesz to przekazać, str()aby uczynić go „ludzkim”. Zaktualizuję odpowiedź, dzięki.
metakermit
53

Możesz użyć profilera cProfile w Pythonie, aby zmierzyć czas procesora, a także ile czasu spędza każda funkcja i ile razy wywoływana jest każda funkcja. Jest to bardzo przydatne, jeśli chcesz poprawić wydajność skryptu, nie wiedząc od czego zacząć. Ta odpowiedź na inne pytanie dotyczące przepełnienia stosu jest całkiem dobra. Zawsze dobrze jest zajrzeć również do dokumentacji .

Oto przykład, jak profilować skrypt za pomocą cProfile z wiersza poleceń:

$ python -m cProfile euler048.py

1007 function calls in 0.061 CPU seconds

Ordered by: standard name
ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.061    0.061 <string>:1(<module>)
 1000    0.051    0.000    0.051    0.000 euler048.py:2(<lambda>)
    1    0.005    0.005    0.061    0.061 euler048.py:2(<module>)
    1    0.000    0.000    0.061    0.061 {execfile}
    1    0.002    0.002    0.053    0.053 {map}
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler objects}
    1    0.000    0.000    0.000    0.000 {range}
    1    0.003    0.003    0.003    0.003 {sum}
jacwah
źródło
@jacwah Jak sumujesz całkowity czas?
Chuck
@Chuck Pierwsza linia mówi X function calls in Y CPU seconds. Jeśli chcesz uzyskać zegar ścienny, skorzystaj z jednej z pozostałych odpowiedzi tutaj.
jacwah
28

Jeszcze lepiej dla Linuksa: time

$ time -v python rhtest2.py

    Command being timed: "python rhtest2.py"
    User time (seconds): 4.13
    System time (seconds): 0.07
    Percent of CPU this job got: 91%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.58
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 0
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 15
    Minor (reclaiming a frame) page faults: 5095
    Voluntary context switches: 27
    Involuntary context switches: 279
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0
u0b34a0f6ae
źródło
18

zegar()

Przestarzałe od wersji 3.3: Zachowanie tej funkcji zależy od platformy: zamiast tego użyj perf_counter () lub process_time () , w zależności od wymagań, aby mieć dobrze zdefiniowane zachowanie.

time.perf_counter ()

Zwraca wartość (w ułamkach sekund) licznika wydajności, tj. Zegara o najwyższej dostępnej rozdzielczości do pomiaru krótkotrwałego. To jest to czas, który upłynął podczas snu i jest w całym systemie.

time.process_time ()

Zwraca wartość (w ułamkach sekund) sumy czasu systemowego i procesora użytkownika bieżącego procesu. To nie obejmuje czasu, który upłynął podczas snu.

start = time.process_time()
... do something
elapsed = (time.process_time() - start)
Tak
źródło
1
Być może zacznij od wniosku: „Użyj time.process_time ()” (lub podobnego)?
Peter Mortensen
17

Po prostu użyj timeitmodułu. Działa zarówno z Python 2, jak i Python 3.

import timeit

start = timeit.default_timer()

# All the program statements
stop = timeit.default_timer()
execution_time = stop - start

print("Program Executed in "+str(execution_time)) # It returns time in seconds

Zwraca się w ciągu kilku sekund i możesz mieć swój czas wykonania. Jest to proste, ale należy je zapisać w głównej funkcji ww, która rozpoczyna wykonywanie programu. Jeśli chcesz uzyskać czas wykonania, nawet jeśli wystąpi błąd, weź do niego parametr „Start” i oblicz tam:

def sample_function(start,**kwargs):
     try:
         # Your statements
     except:
         # except statements run when your statements raise an exception
         stop = timeit.default_timer()
         execution_time = stop - start
         print("Program executed in " + str(execution_time))
Ravi Kumar
źródło
Czy ta część nie powinna być finallyczęścią?
alper
12

Poniższy fragment drukuje upływający czas w przyjemnym dla człowieka <HH:MM:SS>formacie.

import time
from datetime import timedelta

start_time = time.time()

#
# Perform lots of computations.
#

elapsed_time_secs = time.time() - start_time

msg = "Execution took: %s secs (Wall clock time)" % timedelta(seconds=round(elapsed_time_secs))

print(msg)    
Sandeep
źródło
1
na dole znajduje się najbardziej rozsądna odpowiedź („rozsądna” oznacza poleganie w jak największym stopniu na wbudowanych elementach, a zatem najmniej pisanie na klawiaturze).
ijoseph
8
from time import time
start_time = time()
...
end_time = time()
time_taken = end_time - start_time # time_taken is in seconds
hours, rest = divmod(time_taken,3600)
minutes, seconds = divmod(rest, 60)
Qina Yan
źródło
8

W IPython „timeit” dowolny skrypt:

def foo():
    %run bar.py
timeit foo()
B.Kocis
źródło
8

Przyjrzałem się modułowi timeit, ale wygląda na to, że dotyczy tylko małych fragmentów kodu. Chcę zmierzyć czas całego programu.

$ python -mtimeit -n1 -r1 -t -s "from your_module import main" "main()"

Działa your_module.main()jednorazowo i drukuje upływający czas za pomocątime.time() funkcji jako timera.

Aby emulować /usr/bin/timew Pythonie, zobacz podprocesor Pythona w / usr / bin / time: jak przechwytywać informacje o taktowaniu, ale ignorować wszystkie inne dane wyjściowe? .

Aby zmierzyć czas procesora (np. Nie uwzględniaj czasu podczas time.sleep()) dla każdej funkcji, możesz użyć profilemodułu ( cProfilew Pythonie 2):

$ python3 -mprofile your_module.py

Możesz przejść -pdo timeitpowyższego polecenia, jeśli chcesz używać tego samego timera profile, którego używa moduł.

Zobacz Jak profilować skrypt w języku Python?

jfs
źródło
7

Podobało mi się również odpowiedź Paula McGuire'a i wymyśliłem formularz menedżera kontekstu, który bardziej odpowiada moim potrzebom.

import datetime as dt
import timeit

class TimingManager(object):
    """Context Manager used with the statement 'with' to time some execution.

    Example:

    with TimingManager() as t:
       # Code to time
    """

    clock = timeit.default_timer

    def __enter__(self):
        """
        """
        self.start = self.clock()
        self.log('\n=> Start Timing: {}')

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """
        """
        self.endlog()

        return False

    def log(self, s, elapsed=None):
        """Log current time and elapsed time if present.
        :param s: Text to display, use '{}' to format the text with
            the current time.
        :param elapsed: Elapsed time to display. Dafault: None, no display.
        """
        print s.format(self._secondsToStr(self.clock()))

        if(elapsed is not None):
            print 'Elapsed time: {}\n'.format(elapsed)

    def endlog(self):
        """Log time for the end of execution with elapsed time.
        """
        self.log('=> End Timing: {}', self.now())

    def now(self):
        """Return current elapsed time as hh:mm:ss string.
        :return: String.
        """
        return str(dt.timedelta(seconds = self.clock() - self.start))

    def _secondsToStr(self, sec):
        """Convert timestamp to h:mm:ss string.
        :param sec: Timestamp.
        """
        return str(dt.datetime.fromtimestamp(sec))
Żółć
źródło
7

Dla osób korzystających z Notatnika Jupyter

W komórce możesz użyć %%timemagicznego polecenia Jupytera, aby zmierzyć czas wykonania:

%%time
[ x**2 for x in range(10000)]

Wynik

CPU times: user 4.54 ms, sys: 0 ns, total: 4.54 ms
Wall time: 4.12 ms

Spowoduje to tylko przechwycenie czasu wykonania określonej komórki. Jeśli chcesz uchwycić czas wykonania całego notesu (tj. Programu), możesz utworzyć nowy notes w tym samym katalogu i w nowym notesie wykonać wszystkie komórki:

Załóżmy, że powyższy notatnik jest nazywany example_notebook.ipynb. W nowym notatniku w tym samym katalogu:

# Convert your notebook to a .py script:
!jupyter nbconvert --to script example_notebook.ipynb

# Run the example_notebook with -t flag for time
%run -t example_notebook

Wynik

IPython CPU timings (estimated):
  User   :       0.00 s.
  System :       0.00 s.
Wall time:       0.00 s.
Matt
źródło
5

Użyj line_profiler .

line_profiler będzie profilował czas wykonywania poszczególnych linii kodu. Profiler jest zaimplementowany w C przez Cython w celu zmniejszenia narzutu związanego z profilowaniem.

from line_profiler import LineProfiler
import random

def do_stuff(numbers):
    s = sum(numbers)
    l = [numbers[i]/43 for i in range(len(numbers))]
    m = ['hello'+str(numbers[i]) for i in range(len(numbers))]

numbers = [random.randint(1,100) for i in range(1000)]
lp = LineProfiler()
lp_wrapper = lp(do_stuff)
lp_wrapper(numbers)
lp.print_stats()

Wyniki będą:

Timer unit: 1e-06 s

Total time: 0.000649 s
File: <ipython-input-2-2e060b054fea>
Function: do_stuff at line 4

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     4                                           def do_stuff(numbers):
     5         1           10     10.0      1.5      s = sum(numbers)
     6         1          186    186.0     28.7      l = [numbers[i]/43 for i in range(len(numbers))]
     7         1          453    453.0     69.8      m = ['hello'+str(numbers[i]) for i in range(len(numbers))]
Yu Jiaao
źródło
5

Użyłem bardzo prostej funkcji do pomiaru czasu wykonania kodu:

import time
def timing():
    start_time = time.time()
    return lambda x: print("[{:.2f}s] {}".format(time.time() - start_time, x))

I aby go użyć, po prostu wywołaj go przed kodem, aby zmierzyć, aby pobrać czas funkcji, a następnie wywołaj funkcję po kodzie z komentarzami. Czas pojawi się przed komentarzami. Na przykład:

t = timing()
train = pd.read_csv('train.csv',
                        dtype={
                            'id': str,
                            'vendor_id': str,
                            'pickup_datetime': str,
                            'dropoff_datetime': str,
                            'passenger_count': int,
                            'pickup_longitude': np.float64,
                            'pickup_latitude': np.float64,
                            'dropoff_longitude': np.float64,
                            'dropoff_latitude': np.float64,
                            'store_and_fwd_flag': str,
                            'trip_duration': int,
                        },
                        parse_dates = ['pickup_datetime', 'dropoff_datetime'],
                   )
t("Loaded {} rows data from 'train'".format(len(train)))

Następnie dane wyjściowe będą wyglądać następująco:

[9.35s] Loaded 1458644 rows data from 'train'
Tao Wang
źródło
5

Miałem ten sam problem w wielu miejscach, więc stworzyłem pakiet wygody horology. Możesz go zainstalować, pip install horologya następnie zrobić to w elegancki sposób:

from horology import Timing

with Timing(name='Important calculations: '):
    prepare()
    do_your_stuff()
    finish_sth()

wyświetli:

Important calculations: 12.43 ms

Lub nawet prościej (jeśli masz jedną funkcję):

from horology import timed

@timed
def main():
    ...

wyświetli:

main: 7.12 h

Dba o jednostki i zaokrąglanie. Działa z Pythonem 3.6 lub nowszym.

hans
źródło
@DarrenZobacz więcej dokumentów i źródeł tutaj
hans
Czy mogę uzyskać te wartości w zmiennej?
PepeElMago33
Tak, użyj main.interval.
hans
3

To jest odpowiedź Paula McGuire'a, która działa dla mnie. Na wypadek, gdyby ktoś miał problem z uruchomieniem tego.

import atexit
from time import clock

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

def secondsToStr(t):
    return "%d:%02d:%02d.%03d" % \
        reduce(lambda ll,b : divmod(ll[0],b) + ll[1:],
            [(t*1000,),1000,60,60])

line = "="*40
def log(s, elapsed=None):
    print (line)
    print (secondsToStr(clock()), '-', s)
    if elapsed:
        print ("Elapsed time:", elapsed)
    print (line)

def endlog():
    end = clock()
    elapsed = end-start
    log("End Program", secondsToStr(elapsed))

def now():
    return secondsToStr(clock())

def main():
    start = clock()
    atexit.register(endlog)
    log("Start Program")

Zadzwoń timing.main()z twojego programu po zaimportowaniu pliku.

Saurabh Rana
źródło
3

Timeit to klasa w Pythonie używana do obliczania czasu wykonywania małych bloków kodu.

Default_timer to metoda w tej klasie, która służy do pomiaru taktowania zegara ściennego, a nie czasu wykonywania procesora. W związku z tym inne wykonywanie procesu może mieć na to wpływ. Jest więc przydatny w przypadku małych bloków kodu.

Przykładowy kod jest następujący:

from timeit import default_timer as timer

start= timer()

# Some logic

end = timer()

print("Time taken:", end-start)
Utkarsh Dhawan
źródło
timeitjest lepszą odpowiedzią IMO dla wielu przypadków.
Marc
3

Późniejsza odpowiedź, ale używam timeit:

import timeit
code_to_test = """
a = range(100000)
b = []
for i in a:
    b.append(i*2)
"""
elapsed_time = timeit.timeit(code_to_test, number=500)
print(elapsed_time)
# 10.159821493085474

  • Zawiń w środku cały kod, w tym wszelkie importowane pliki code_to_test.
  • number argument określa liczbę powtórzeń kodu.
  • Próbny
CONvid19
źródło
A co jeśli chcesz zmierzyć czas w jakiejś części kodu, której nie można umieścić w ciągu?
Daniel Stracaboško
@ Daniel Możesz utworzyć nowe pytanie. Jeśli opublikujesz link tutaj, mogę Ci pomóc.
CONvid19
2

Czas wykonania programu w języku Python może być niespójny w zależności od:

  • Ten sam program można ocenić przy użyciu różnych algorytmów
  • Czas działania różni się w zależności od algorytmu
  • Czas działania zależy od implementacji
  • Czas działania zależy od komputera
  • Czas pracy nie jest przewidywalny na podstawie niewielkich nakładów

Wynika to z tego, że najskuteczniejszym sposobem jest użycie „Porządku wzrostu” i nauka dużej notacji „O” aby zrobić to poprawnie.

W każdym razie możesz spróbować ocenić wydajność dowolnego programu w języku Python w określonych krokach liczenia maszyn na sekundę za pomocą tego prostego algorytmu: dostosuj to do programu, który chcesz ocenić

import time

now = time.time()
future = now + 10
step = 4 # Why 4 steps? Because until here already four operations executed
while time.time() < future:
    step += 3 # Why 3 again? Because a while loop executes one comparison and one plus equal statement
step += 4 # Why 3 more? Because one comparison starting while when time is over plus the final assignment of step + 1 and print statement
print(str(int(step / 10)) + " steps per second")
Manu
źródło
2

Robisz to po prostu w Pythonie. Nie trzeba tego komplikować.

import time

start = time.localtime()
end = time.localtime()
"""Total execution time in seconds$ """
print(end.tm_sec - start.tm_sec)
Mitul Panchal
źródło
2

Podobnie do odpowiedzi z @rogeriopvl dodałem niewielką modyfikację, aby przekonwertować na godziny i minuty, używając tej samej biblioteki dla zadań długo działających.

import time
start_time = time.time()
main()
seconds = time.time() - start_time
print('Time Taken:', time.strftime("%H:%M:%S",time.gmtime(seconds)))

Przykładowe dane wyjściowe

Time Taken: 00:00:08
użytkownik 923227
źródło
2

Najpierw należy zainstalować humanfriendly pakiet otwierając wiersza poleceń (cmd) jako administrator i wpisz tam - pip install humanfriendly

Kod:

from humanfriendly import format_timespan
import time
begin_time = time.time()
# Put your code here
end_time = time.time() - begin_time
print("Total execution time: ", format_timespan(end_time))

Wynik:

wprowadź opis zdjęcia tutaj

Amar Kumar
źródło
1

Aby użyć zaktualizowanej odpowiedzi metakermita dla Pythona 2.7, będziesz potrzebować pakietu monotonicznego .

Kod wyglądałby następująco:

from datetime import timedelta
from monotonic import monotonic

start_time = monotonic()
end_time = monotonic()
print(timedelta(seconds=end_time - start_time))
H0R5E
źródło
1

Próbowałem i znalazłem różnicę czasu przy użyciu następujących skryptów.

import time

start_time = time.perf_counter()
[main code here]
print (time.perf_counter() - start_time, "seconds")
Hafez Ahmad
źródło
0

Jeśli chcesz mierzyć czas w mikrosekundach, możesz użyć następującej wersji, całkowicie opartej na odpowiedziach Paula McGuire'a i Nicojo - jest to kod Python 3. Dodałem też trochę koloru:

import atexit
from time import time
from datetime import timedelta, datetime


def seconds_to_str(elapsed=None):
    if elapsed is None:
        return datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    else:
        return str(timedelta(seconds=elapsed))


def log(txt, elapsed=None):
    colour_cyan = '\033[36m'
    colour_reset = '\033[0;0;39m'
    colour_red = '\033[31m'
    print('\n ' + colour_cyan + '  [TIMING]> [' + seconds_to_str() + '] ----> ' + txt + '\n' + colour_reset)
    if elapsed:
        print("\n " + colour_red + " [TIMING]> Elapsed time ==> " + elapsed + "\n" + colour_reset)


def end_log():
    end = time()
    elapsed = end-start
    log("End Program", seconds_to_str(elapsed))


start = time()
atexit.register(end_log)
log("Start Program")

log () => funkcja drukująca informacje o taktowaniu.

txt ==> pierwszy argument do zalogowania i jego ciąg do oznaczenia czasu.

atexit ==> moduł Pythona do rejestrowania funkcji, które można wywołać po wyjściu z programu.

Rui Carvalho
źródło