Χρησιμοποιώντας την ενότητα timeit της τυπικής βιβλιοθήκης της Python, μπορείτε εύκολα να μετρήσετε το χρόνο εκτέλεσης μιας διεργασίας στον κώδικά σας. Αυτό είναι χρήσιμο για έναν γρήγορο έλεγχο.
Εδώ θα συζητηθούν οι ακόλουθες δύο περιπτώσεις.
- Μέτρο σε ένα αρχείο Python:
timeit.timeit()
,timeit.repeat()
- Μέτρηση με το Jupyter Notebook:
%timeit
,%%timeit
Ένας άλλος τρόπος είναι να χρησιμοποιήσετε την time.time() για να μετρήσετε τον χρόνο που παρήλθε στο πρόγραμμα.
Μετρήσεις σε αρχεία Python: timeit.timeit(), timeit.repeat()
Ως παράδειγμα, θα μετρήσουμε το χρόνο επεξεργασίας μιας απλής συνάρτησης, της test(n), η οποία υπολογίζει το άθροισμα n διαδοχικών αριθμών.
import timeit
def test(n):
return sum(range(n))
n = 10000
loop = 1000
result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842
Αν περάσετε τον κώδικα που θέλετε να μετρήσετε ως συμβολοσειρά στη συνάρτηση timeit.timeit(), θα εκτελεστεί ΑΡΙΘΜΟΣ φορές και θα επιστραφεί ο χρόνος που χρειάστηκε.
Η προεπιλεγμένη τιμή για τον αριθμό είναι 1.000.000. Σημειώστε ότι αν χρησιμοποιήσετε την προεπιλεγμένη τιμή για μια χρονοβόρα διαδικασία, θα χρειαστεί πολύς χρόνος.
Περνώντας την globals() ως όρισμα globals, ο κώδικας θα εκτελεστεί στον παγκόσμιο χώρο ονομάτων.
Χωρίς αυτό, η συνάρτηση test και η μεταβλητή n δεν αναγνωρίζονται στο παραπάνω παράδειγμα.
Ο κώδικας που πρέπει να προσδιοριστεί μπορεί να είναι ένα αντικείμενο που μπορεί να κληθεί αντί για συμβολοσειρά, οπότε μπορεί να προσδιοριστεί ως έκφραση λάμδα χωρίς ορίσματα- σε αυτή την περίπτωση, το όρισμα globals δεν χρειάζεται να προσδιοριστεί.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Η μονάδα του αποτελέσματος είναι τα δευτερόλεπτα. Εδώ, το αποτέλεσμα είναι ο χρόνος επεξεργασίας ανά εκτέλεση διαιρεμένος με τον αριθμό των εκτελέσεων.
Εάν δεν διαιρέσετε, η τιμή του αποτελέσματος απλώς θα γίνεται μεγαλύτερη καθώς αυξάνετε τον αριθμό των εκτελέσεων.
print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038
Χρησιμοποιώντας τη συνάρτηση timeit.repeat(), η timeit() μπορεί να εκτελεστεί επανειλημμένα. Το αποτέλεσμα θα λαμβάνεται ως λίστα.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Μέτρηση με το Jupyter Notebook:%timeit, %%timeit
Στο Jupyter Notebook (IPython), μπορείτε να χρησιμοποιήσετε τις ακόλουθες μαγικές εντολές- δεν χρειάζεται να εισαγάγετε το module timeit.
%timeit
%%timeit
%timeit
Στο %timeit, καθορίστε τον κωδικό-στόχο χωρισμένο με κενό όπως τα ορίσματα της γραμμής εντολών.
Από προεπιλογή, ο αριθμός και η επανάληψη στην timeit.timeit() καθορίζονται αυτόματα. Μπορείτε επίσης να τα καθορίσετε με τις επιλογές -n και -r.
Τα αποτελέσματα υπολογίζονται ως μέσος όρος και τυπική απόκλιση.
%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
%%timeit
Η μαγική εντολή %%timeit μπορεί να χρησιμοποιηθεί για τη μέτρηση του χρόνου επεξεργασίας ενός ολόκληρου κελιού.
Ως παράδειγμα, ας εκτελέσουμε την ίδια διαδικασία χρησιμοποιώντας την NumPy. Οι επιλογές -n και -r μπορούν να παραλειφθούν.
Δεδομένου ότι μετράμε το χρόνο επεξεργασίας ολόκληρου του κελιού, το ακόλουθο παράδειγμα περιλαμβάνει το χρόνο εισαγωγής του NumPy.
%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
Δεν χρειάζεται να καθορίσετε τον κώδικα-στόχο ως όρισμα για το %%timeit. Το μόνο που χρειάζεται να κάνετε είναι να γράψετε το %%timeit στην αρχή ενός κελιού, οπότε είναι το πιο εύκολο στη χρήση.