Χρησιμοποιώντας το Python Timeit για να χρονομετρήσετε τον κώδικα σας

Σε αυτό το σεμινάριο, θα μάθετε πώς να χρησιμοποιείτε τη συνάρτηση timeit από την ενότητα timeit της Python. Θα μάθετε πώς να χρονομετράτε απλές εκφράσεις και συναρτήσεις στην Python.

Ο χρονισμός του κώδικά σας μπορεί να σας βοηθήσει να λάβετε μια εκτίμηση του χρόνου εκτέλεσης ενός τμήματος κώδικα και επίσης να προσδιορίσετε τα τμήματα του κώδικα που πρέπει να βελτιστοποιηθούν.

Θα ξεκινήσουμε μαθαίνοντας τη σύνταξη της συνάρτησης timeit της Python. Και στη συνέχεια θα κωδικοποιήσουμε παραδείγματα για να κατανοήσουμε πώς να το χρησιμοποιήσετε για τη χρονομέτρηση μπλοκ κώδικα και συναρτήσεων στη λειτουργική μονάδα Python σας. Ας ξεκινήσουμε.

Πώς να χρησιμοποιήσετε τη συνάρτηση timeit Python

Η ενότητα timeit είναι μέρος της τυπικής βιβλιοθήκης Python και μπορείτε να την εισαγάγετε:

import timeit

Η σύνταξη για τη χρήση της συνάρτησης timeit από την ενότητα timeit είναι όπως φαίνεται παρακάτω:

timeit.timeit(stmt, setup, number)

Εδώ:

  • Το stmt είναι το κομμάτι κώδικα του οποίου ο χρόνος εκτέλεσης πρέπει να μετρηθεί. Μπορείτε να το καθορίσετε ως μια απλή συμβολοσειρά Python ή μια συμβολοσειρά πολλών γραμμών ή να περάσετε στο όνομα του καλούμενου.
  • Όπως υποδηλώνει το όνομα, το setup υποδηλώνει το κομμάτι κώδικα που πρέπει να εκτελεστεί μόνο μία φορά, συχνά ως προϋπόθεση για την εκτέλεση του stmt. Για παράδειγμα, ας υποθέσουμε ότι υπολογίζετε το χρόνο εκτέλεσης για τη δημιουργία ενός πίνακα NumPy. Σε αυτήν την περίπτωση, η εισαγωγή numpy είναι ο κωδικός εγκατάστασης και η πραγματική δημιουργία είναι η δήλωση για να χρονομετρηθεί.
  • Ο αριθμός παραμέτρου υποδηλώνει πόσες φορές εκτελείται το stmt. Η προεπιλεγμένη τιμή του αριθμού είναι 1 εκατομμύριο (1000000), αλλά μπορείτε επίσης να ορίσετε αυτήν την παράμετρο σε οποιαδήποτε άλλη τιμή της επιλογής σας.

Τώρα που μάθαμε τη σύνταξη να χρησιμοποιούμε τη συνάρτηση timeit(), ας αρχίσουμε να κωδικοποιούμε μερικά παραδείγματα.

Χρονισμός Απλές εκφράσεις Python

Σε αυτήν την ενότητα, θα προσπαθήσουμε να μετρήσουμε τον χρόνο εκτέλεσης απλών εκφράσεων Python χρησιμοποιώντας το timeit.

Ξεκινήστε μια Python REPL και εκτελέστε τα ακόλουθα παραδείγματα κώδικα. Εδώ, υπολογίζουμε τον χρόνο εκτέλεσης των πράξεων εκθέσεως και διαίρεσης ορόφου για 10000 και 100000 διαδρομές.

  8 Προσλάβετε πλατφόρμες μάρκετινγκ για να προσλάβετε τον καλύτερο εμπειρογνώμονα μάρκετινγκ ηλεκτρονικού ταχυδρομείου

Παρατηρήστε ότι περνάμε στη δήλωση να χρονομετρηθεί ως συμβολοσειρά Python και χρησιμοποιούμε ένα ερωτηματικό για να διαχωρίσουμε τις διαφορετικές εκφράσεις στη δήλωση.

>>> import timeit
>>> timeit.timeit('3**4;3//4',number=10000)
0.0004020999999738706

>>> timeit.timeit('3**4;3//4',number=100000)
0.0013780000000451764

Εκτέλεση χρόνου Python στη γραμμή εντολών

Μπορείτε επίσης να χρησιμοποιήσετε το timeit στη γραμμή εντολών. Εδώ είναι το ισοδύναμο της γραμμής εντολών της κλήσης της συνάρτησης timeit:

$ python-m timeit -n [number] -s [setup] [stmt]
  • Το python -m timeit αντιπροσωπεύει ότι τρέχουμε το timeit ως κύρια λειτουργική μονάδα.
  • Το n είναι μια επιλογή γραμμής εντολών που υποδηλώνει πόσες φορές πρέπει να εκτελεστεί ο κώδικας. Αυτό είναι ισοδύναμο με το όρισμα αριθμού στην κλήση της συνάρτησης timeit().
  • Μπορείτε να χρησιμοποιήσετε την επιλογή -s για να ορίσετε τον κωδικό εγκατάστασης.

Εδώ, ξαναγράφουμε το προηγούμενο παράδειγμα χρησιμοποιώντας το ισοδύναμο της γραμμής εντολών:

$ python -m timeit -n 100000 '3**4;3//4'
100000 loops, best of 5: 35.8 nsec per loop

Σε αυτό το παράδειγμα, υπολογίζουμε τον χρόνο εκτέλεσης της ενσωματωμένης συνάρτησης len(). Η προετοιμασία της συμβολοσειράς είναι ο κωδικός εγκατάστασης που μεταβιβάζεται χρησιμοποιώντας την επιλογή s.

$ python -m timeit -n 100000 -s "string_1 = 'coding'" 'len(string_1)'
100000 loops, best of 5: 239 nsec per loop

Στην έξοδο, παρατηρήστε ότι παίρνουμε τον χρόνο εκτέλεσης για το καλύτερο από 5 τρεξίματα. Τι σημαίνει αυτό? Όταν εκτελείτε το timeit στη γραμμή εντολών, η επιλογή επανάληψης r ορίζεται στην προεπιλεγμένη τιμή 5. Αυτό σημαίνει ότι η εκτέλεση του stmt για τον καθορισμένο αριθμό φορών επαναλαμβάνεται πέντε φορές και επιστρέφεται ο καλύτερος από τους χρόνους εκτέλεσης.

Ανάλυση μεθόδων αντιστροφής συμβολοσειρών με χρήση timeit

Όταν εργάζεστε με συμβολοσειρές Python, μπορεί να θέλετε να τις αντιστρέψετε. Οι δύο πιο κοινές προσεγγίσεις για την αντιστροφή χορδών είναι οι εξής:

  • Χρησιμοποιώντας τεμαχισμό χορδών
  • Χρησιμοποιώντας τη συνάρτηση reversed() και τη μέθοδο join().

Αντίστροφη συμβολοσειρά Python με χρήση συμβολοσειράς σε φέτες

Ας δούμε πώς λειτουργεί ο τεμαχισμός συμβολοσειρών και πώς μπορείτε να το χρησιμοποιήσετε για να αντιστρέψετε μια συμβολοσειρά Python. Χρησιμοποιώντας τη σύνταξη some-string[start:stop] επιστρέφει ένα κομμάτι της συμβολοσειράς που ξεκινά από την αρχή του ευρετηρίου και εκτείνεται μέχρι τη στάση ευρετηρίου-1. Ας πάρουμε ένα παράδειγμα.

Σκεφτείτε την ακόλουθη συμβολοσειρά «Python». Η συμβολοσειρά έχει μήκος 6 και η λίστα των δεικτών είναι 0, 1, 2 έως 5.

  Τι είναι το "Jiggle Mode" στο iPhone και σε άλλες συσκευές Apple;

>>> string_1 = 'Python'

Όταν καθορίζετε και τις δύο τιμές έναρξης και διακοπής, λαμβάνετε ένα κομμάτι συμβολοσειράς που εκτείνεται από την αρχή έως το τέλος-1. Επομένως, string_1[1:4] επιστρέφει ‘yth’.

>>> string_1 = 'Python'
>>> string_1[1:4]
'yth'

Όταν δεν καθορίζετε την τιμή έναρξης, χρησιμοποιείται η προεπιλεγμένη τιμή έναρξης του μηδέν και το slice ξεκινά από το μηδέν δείκτη και εκτείνεται μέχρι το τέλος – 1.

Εδώ, η τιμή διακοπής είναι 3, οπότε το slice ξεκινά από τον δείκτη 0 και ανεβαίνει στον δείκτη 2.

>>> string_1[:3]
'Pyt'

Όταν δεν συμπεριλάβετε το δείκτη διακοπής, βλέπετε ότι το slice ξεκινά από τον δείκτη έναρξης (1) και εκτείνεται μέχρι το τέλος της συμβολοσειράς.

>>> string_1[1:]
'ython'

Η παράβλεψη και των δύο τιμών έναρξης και διακοπής επιστρέφει ένα κομμάτι ολόκληρης της συμβολοσειράς.

>>> string_1[::]
'Python'

Ας δημιουργήσουμε ένα slice με την τιμή του βήματος. Ορίστε τις τιμές έναρξης, διακοπής και βήματος σε 1, 5 και 2, αντίστοιχα. Λαμβάνουμε ένα κομμάτι της συμβολοσειράς που ξεκινά από το 1 και εκτείνεται μέχρι το 4 (εξαιρουμένου του τελικού σημείου 5) που περιέχει κάθε δεύτερο χαρακτήρα.

>>> string_1[1:5:2]
'yh'

Όταν χρησιμοποιείτε ένα αρνητικό βήμα, μπορείτε να πάρετε μια φέτα που ξεκινά από το τέλος της συμβολοσειράς. Με το βήμα ορισμένο σε -2, string_1[5:2:-2] δίνει το ακόλουθο κομμάτι:

>>> string_1[5:2:-2]
'nh'

Έτσι, για να λάβουμε ένα αντίστροφο αντίγραφο της συμβολοσειράς, παραλείπουμε τις τιμές έναρξης και λήξης και ορίζουμε το βήμα σε -1, όπως φαίνεται:

>>> string_1[::-1]
'nohtyP'

Συνοπτικά: συμβολοσειρά[::-1] επιστρέφει ένα αντίστροφο αντίγραφο της συμβολοσειράς.

Αντιστροφή συμβολοσειρών με χρήση ενσωματωμένων συναρτήσεων και μεθόδων συμβολοσειράς

Η ενσωματωμένη συνάρτηση reversed() στην Python θα επιστρέψει έναν αντίστροφο επαναλήπτη πάνω από τα στοιχεία της συμβολοσειράς.

>>> string_1 = 'Python'
>>> reversed(string_1)
<reversed object at 0x00BEAF70>

Έτσι, μπορείτε να κάνετε βρόχο μέσω του αντίστροφου επαναλήπτη χρησιμοποιώντας έναν βρόχο for:

for char in reversed(string_1):
    print(char)

Και αποκτήστε πρόσβαση στα στοιχεία της συμβολοσειράς με την αντίστροφη σειρά.

# Output
n
o
h
t
y
P

Στη συνέχεια, μπορείτε να καλέσετε τη μέθοδο join() στον αντίστροφο επαναλήπτη με τη σύνταξη: .join(reversed(some-string)).

Το παρακάτω απόσπασμα κώδικα δείχνει μερικά παραδείγματα όπου το διαχωριστικό είναι μια παύλα και ένα κενό διάστημα, αντίστοιχα.

>>> '-'.join(reversed(string1))
'n-o-h-t-y-P'
>>> ' '.join(reversed(string1))
'n o h t y P'

Εδώ, δεν θέλουμε κανένα διαχωριστικό. οπότε ορίστε το διαχωριστικό σε μια κενή συμβολοσειρά για να λάβετε ένα αντίστροφο αντίγραφο της συμβολοσειράς:

>>> ''.join(reversed(string1))
'nohtyP'

Χρησιμοποιώντας το .join(reversed(some-string)) επιστρέφει ένα αντίστροφο αντίγραφο της συμβολοσειράς.

Σύγκριση χρόνων εκτέλεσης Χρήση timeit

Μέχρι στιγμής, μάθαμε δύο προσεγγίσεις για την αντιστροφή συμβολοσειρών Python. Ποιο από αυτά όμως είναι πιο γρήγορο; Ας ανακαλύψουμε.

  14 πορτοφόλια κρυπτονομισμάτων για την ασφαλή αποθήκευση του κρυπτονομίσματος σας

Σε ένα προηγούμενο παράδειγμα όπου μετρήσαμε απλές εκφράσεις Python, δεν είχαμε κώδικα εγκατάστασης. Εδώ, αντιστρέφουμε τη συμβολοσειρά Python. Ενώ η λειτουργία αντιστροφής συμβολοσειράς εκτελείται για τον αριθμό των φορών που καθορίζονται από τον αριθμό, ο κωδικός εγκατάστασης είναι η προετοιμασία της συμβολοσειράς που θα εκτελεστεί μόνο μία φορά.

>>> import timeit
>>> timeit.timeit(stmt="string_1[::-1]", setup = "string_1 = 'Python'", number = 100000)
0.04951830000001678
>>> timeit.timeit(stmt = "''.join(reversed(string_1))", setup = "string_1 = 'Python'", number = 100000)
0.12858760000000302

Για τον ίδιο αριθμό εκτελέσεων για την αντιστροφή της δεδομένης συμβολοσειράς, η προσέγγιση κοπής συμβολοσειράς είναι ταχύτερη από τη χρήση της μεθόδου join() και της συνάρτησης reversed().

Χρονισμός Λειτουργίες Python Χρήση timeit

Σε αυτήν την ενότητα, ας μάθουμε πώς να χρονομετρούμε συναρτήσεις Python με τη συνάρτηση timeit. Δεδομένης μιας λίστας συμβολοσειρών, η ακόλουθη συνάρτηση hasDigit επιστρέφει τη λίστα συμβολοσειρών που έχουν τουλάχιστον ένα ψηφίο.

def hasDigit(somelist):
     str_with_digit = []
     for string in somelist:
         check_char = [char.isdigit() for char in string]
         if any(check_char):
            str_with_digit.append(string)
     return str_with_digit

Τώρα θα θέλαμε να μετρήσουμε τον χρόνο εκτέλεσης αυτής της συνάρτησης Python hasDigit() χρησιμοποιώντας timeit.

Ας προσδιορίσουμε πρώτα τη δήλωση που θα χρονομετρηθεί (stmt). Είναι η κλήση στη συνάρτηση hasDigit() με μια λίστα συμβολοσειρών ως όρισμα. Στη συνέχεια, ας ορίσουμε τον κωδικό εγκατάστασης. Μπορείτε να μαντέψετε ποιος πρέπει να είναι ο κωδικός εγκατάστασης;

Για να εκτελεστεί με επιτυχία η κλήση συνάρτησης, ο κωδικός εγκατάστασης θα πρέπει να περιλαμβάνει τα εξής:

  • Ο ορισμός της συνάρτησης hasDigit()
  • Η προετοιμασία της λίστας ορισμάτων των συμβολοσειρών

Ας ορίσουμε τον κωδικό εγκατάστασης στη συμβολοσειρά εγκατάστασης, όπως φαίνεται παρακάτω:

setup = """
def hasDigit(somelist):
    str_with_digit = []
    for string in somelist:
      check_char = [char.isdigit() for char in string]
      if any(check_char):
        str_with_digit.append(string)
    return str_with_digit
thislist=['puffin3','7frost','blue']
     """

Στη συνέχεια, μπορούμε να χρησιμοποιήσουμε τη συνάρτηση timeit και να πάρουμε το χρόνο εκτέλεσης της συνάρτησης hasDigit() για 100000 εκτελέσεις.

import timeit
timeit.timeit('hasDigit(thislist)',setup=setup,number=100000)
# Output
0.2810094920000097

συμπέρασμα

Έχετε μάθει πώς να χρησιμοποιείτε τη συνάρτηση timeit της Python για χρονικές εκφράσεις, συναρτήσεις και άλλα καλέσιμα. Αυτό μπορεί να σας βοηθήσει να κάνετε συγκριτική αξιολόγηση του κώδικά σας, να συγκρίνετε τους χρόνους εκτέλεσης διαφορετικών υλοποιήσεων της ίδιας συνάρτησης και πολλά άλλα.

Ας δούμε τι μάθαμε σε αυτό το σεμινάριο. Μπορείτε να χρησιμοποιήσετε τη συνάρτηση timeit() με τη σύνταξη timeit.timeit(stmt=…,setup=…,number=…). Εναλλακτικά, μπορείτε να εκτελέσετε το timeit στη γραμμή εντολών για να χρονομετρήσετε σύντομα αποσπάσματα κώδικα.

Ως επόμενο βήμα, μπορείτε να εξερευνήσετε πώς να χρησιμοποιήσετε άλλα πακέτα προφίλ Python όπως το line-profiler και το memprofiler για να δημιουργήσετε προφίλ του κώδικά σας για χρόνο και μνήμη, αντίστοιχα.

Στη συνέχεια, μάθετε πώς να υπολογίζετε τη διαφορά ώρας στην Python.