Προγραμματισμός

Πώς να χρησιμοποιήσετε το χρονοδιάγραμμα για τον προφίλ κώδικα Python

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

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

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

Ένα απλό παράδειγμα χρόνου Python

Εδώ είναι ένα απλό παράδειγμα του πώς χρονικά έργα:

def f1 (): για n στην περιοχή (100): pass def f2 (): n = 0 ενώ n <100: n + = 1 εάν __name__ == "__main__": εισαγωγή χρονικής εκτύπωσης (timeit.timeit (f1, number = 100000)) εκτύπωση (timeit.timeit (f2, number = 100000)) 

Αυτό το πρόγραμμα συγκρίνει την απόδοση δύο τρόπων επανάληψης μέσω βρόχου 100 φορές: χρησιμοποιώντας το ενσωματωμένο Pythonεύρος λειτουργία (στ1), και αυξάνοντας μια μεταβλητή (στ2). χρονικά εκτελεί καθεμία από αυτές τις προσεγγίσεις 100.000 φορές και παρέχει συνολικό χρόνο εκτέλεσης στο τέλος για κάθε μία. Από προεπιλογή,χρονικά χρησιμοποιεί ένα εκατομμύριο διαδρομές, αλλά αυτό το παράδειγμα δείχνει πώς μπορείτε να ορίσετε τον αριθμό των διαδρομών σε οποιοδήποτε σχήμα που φαίνεται κατάλληλο.

Τα αποτελέσματα (από επεξεργαστή Intel i7-3770K):

0.1252315

0.45453989999999994

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

Χρησιμοποιήστε το Python timeit περνώντας μια συμβολοσειρά

Ένας άλλος τρόπος χρήσηςχρονικά είναι να περάσει μια συμβολοσειρά που αξιολογείται ως πρόγραμμα Python:

εισαγωγή χρονικού ορίου

εκτύπωση (timeit.timeit ('for n in range (100): pass'))

Αυτό μπορεί επίσης να γίνει από τη γραμμή εντολών:

python -m timeit "για n στην περιοχή (100): pass"

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

Συμβουλές Python timeit

Όσο χρήσιμοχρονικά είναι, λάβετε υπόψη αυτές τις προειδοποιήσεις για το πώς να το χρησιμοποιήσετε.

Αποφύγετε τη χρήση χρονομέτρου για τη δημιουργία προφίλ ολόκληρου του προγράμματος

Τίποτα δεν σας λέεικλίση χρόνο ένα ολόκληρο πρόγραμμα μεχρονικά. Ένα απλό σενάριο 10 γραμμών, για παράδειγμα, δεν είναι κακός υποψήφιος για τη δημιουργία προφίλ με αυτόν τον τρόπο.

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

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

Εκτελέστε πολλαπλές χρονοτριβές σε διαφορετικά μηχανήματα

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

Τέλος, βοηθά επίσης να εκτελέσετε την ίδια δοκιμή σε διαφορετικά συστήματα: πώς θα συμπεριφέρεται κάτι συνδεδεμένο με δίσκο σε SSD έναντι συμβατικού περιστρεφόμενου σκληρού δίσκου; Όπως με οποιαδήποτε άλλη ερώτηση σχετικά με την απόδοση - μην μαντέψετε, δοκιμάστε.