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

Pos Na Beltistopoiesete Ton Kodika Python Sas Me Ergaleia Prophil



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

Βελτιστοποίηση του κώδικα Python με εργαλεία προφίλ

Ρυθμίζοντας το Google Colab ώστε να εργάζεται για τη βελτιστοποίηση του κώδικα Python με εργαλεία δημιουργίας προφίλ, ξεκινάμε με τη δημιουργία ενός περιβάλλοντος Google Colab. Αν είμαστε νέοι στο Colab, είναι μια ουσιαστική, ισχυρή πλατφόρμα που βασίζεται σε σύννεφο που παρέχει πρόσβαση σε σημειωματάρια Jupyter και μια σειρά από βιβλιοθήκες Python. Έχουμε πρόσβαση στο Colab επισκεπτόμενοι το (https://colab.research.google.com/) και δημιουργώντας ένα νέο σημειωματάριο Python.

Εισαγάγετε τις Βιβλιοθήκες προφίλ

Η βελτιστοποίησή μας βασίζεται στην επάρκεια χρήσης βιβλιοθηκών δημιουργίας προφίλ. Δύο σημαντικές βιβλιοθήκες σε αυτό το πλαίσιο είναι η cProfile και η line_profiler.







εισαγωγή cΠροφίλ

εισαγωγή line_profiler

Η βιβλιοθήκη «cProfile» είναι ένα ενσωματωμένο εργαλείο Python για δημιουργία προφίλ κώδικα, ενώ το «line_profiler» είναι ένα εξωτερικό πακέτο που μας επιτρέπει να πάμε ακόμα βαθύτερα, αναλύοντας τον κώδικα γραμμή προς γραμμή.



Σε αυτό το βήμα, δημιουργούμε ένα δείγμα σεναρίου Python για να υπολογίσουμε την ακολουθία Fibonacci χρησιμοποιώντας μια αναδρομική συνάρτηση. Ας αναλύσουμε αυτή τη διαδικασία σε μεγαλύτερο βάθος. Η ακολουθία Fibonacci είναι ένα σύνολο αριθμών στους οποίους κάθε διαδοχικός αριθμός είναι το άθροισμα των δύο πριν από αυτόν. Συνήθως ξεκινά με 0 και 1, οπότε η ακολουθία μοιάζει με 0, 1, 1, 2, 3, 5, 8, 13, 21 κ.ο.κ. Είναι μια μαθηματική ακολουθία που χρησιμοποιείται συνήθως ως παράδειγμα στον προγραμματισμό λόγω της αναδρομικής φύσης της.



Ορίζουμε μια συνάρτηση Python που ονομάζεται 'Fibonacci' στην αναδρομική συνάρτηση Fibonacci. Αυτή η συνάρτηση παίρνει έναν ακέραιο 'n' ως όρισμα, που αντιπροσωπεύει τη θέση στην ακολουθία Fibonacci που θέλουμε να υπολογίσουμε. Θέλουμε να εντοπίσουμε τον πέμπτο αριθμό στην ακολουθία Fibonacci, για παράδειγμα, εάν το 'n' ισούται με 5.





def Φιμπονάτσι ( n ) :

Στη συνέχεια, δημιουργούμε μια θήκη βάσης. Μια βασική περίπτωση στην αναδρομή είναι ένα σενάριο που τερματίζει τις κλήσεις και επιστρέφει μια προκαθορισμένη τιμή. Στην ακολουθία Fibonacci, όταν το 'n' είναι 0 ή 1, γνωρίζουμε ήδη το αποτέλεσμα. Ο 0ος και ο 1ος αριθμός Fibonacci είναι 0 και 1, αντίστοιχα.

αν n <= 1 :

ΕΠΙΣΤΡΟΦΗ n

Αυτή η δήλωση «αν» καθορίζει εάν το «n» είναι μικρότερο ή ίσο με 1. Εάν είναι, επιστρέφουμε το ίδιο το «n», καθώς δεν υπάρχει ανάγκη για περαιτέρω αναδρομή.



Αναδρομικός Υπολογισμός

Εάν το 'n' υπερβαίνει το 1, προχωράμε στον αναδρομικό υπολογισμό. Σε αυτήν την περίπτωση, πρέπει να βρούμε τον «n»-ο αριθμό Fibonacci αθροίζοντας τους αριθμούς «(n-1)» και «(n-2)» ου Fibonacci. Αυτό το επιτυγχάνουμε πραγματοποιώντας δύο αναδρομικές κλήσεις εντός της συνάρτησης.

αλλού :

ΕΠΙΣΤΡΟΦΗ Φιμπονάτσι ( n - 1 ) + Φιμπονάτσι ( n - 2 )

Εδώ, το 'fibonacci(n – 1)' υπολογίζει τον '(n-1)'ο αριθμό Fibonacci και το 'fibonacci(n - 2)' υπολογίζει τον '(n-2)'ο αριθμό Fibonacci. Προσθέτουμε αυτές τις δύο τιμές για να πάρουμε τον επιθυμητό αριθμό Fibonacci στη θέση «n».

Συνοπτικά, αυτή η συνάρτηση «fibonacci» υπολογίζει αναδρομικά τους αριθμούς Fibonacci σπάζοντας το πρόβλημα σε μικρότερα υποπροβλήματα. Πραγματοποιεί αναδρομικές κλήσεις μέχρι να φτάσει στις βασικές περιπτώσεις (0 ή 1), επιστρέφοντας γνωστές τιμές. Για οποιοδήποτε άλλο 'n', υπολογίζει τον αριθμό Fibonacci αθροίζοντας τα αποτελέσματα δύο αναδρομικών κλήσεων για '(n-1)' και '(n-2)'.

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

Προφίλ του κώδικα με το CProfile

Τώρα, σχεδιάζουμε τη συνάρτηση «fibonacci» χρησιμοποιώντας το «cProfile». Αυτή η άσκηση δημιουργίας προφίλ παρέχει πληροφορίες για το χρόνο που καταναλώνεται από κάθε κλήση συνάρτησης.

cprofiler = cΠροφίλ. Προφίλ ( )

cprofiler. επιτρέπω ( )

αποτέλεσμα = Φιμπονάτσι ( 30 )

cprofiler. καθιστώ ανίκανο ( )

cprofiler. print_stats ( είδος = 'σωρευτικός' )

Σε αυτό το τμήμα, αρχικοποιούμε ένα αντικείμενο 'cProfile', ενεργοποιούμε το προφίλ, ζητάμε τη συνάρτηση 'fibonacci' με 'n=30', απενεργοποιούμε το προφίλ και εμφανίζουμε τα στατιστικά στοιχεία που ταξινομούνται κατά αθροιστικό χρόνο. Αυτό το αρχικό προφίλ μας δίνει μια επισκόπηση υψηλού επιπέδου για το ποιες λειτουργίες καταναλώνουν τον περισσότερο χρόνο.

! pip install line_profiler

εισαγωγή cΠροφίλ

εισαγωγή line_profiler

def Φιμπονάτσι ( n ) :

αν n <= 1 :

ΕΠΙΣΤΡΟΦΗ n

αλλού :

ΕΠΙΣΤΡΟΦΗ Φιμπονάτσι ( n - 1 ) + Φιμπονάτσι ( n - 2 )

cprofiler = cΠροφίλ. Προφίλ ( )

cprofiler. επιτρέπω ( )

αποτέλεσμα = Φιμπονάτσι ( 30 )

cprofiler. καθιστώ ανίκανο ( )

cprofiler. print_stats ( είδος = 'σωρευτικός' )

Για να προφίλ του κώδικα γραμμή προς γραμμή με line_profiler για πιο λεπτομερή ανάλυση, χρησιμοποιούμε το 'line_profiler' για να τμηματοποιήσουμε τον κώδικα γραμμή προς γραμμή. Πριν χρησιμοποιήσουμε το 'line_profiler', πρέπει να εγκαταστήσουμε το πακέτο στο αποθετήριο Colab.

! pip install line_profiler

Τώρα που έχουμε έτοιμο το 'line_profiler', μπορούμε να το εφαρμόσουμε στη συνάρτηση 'fibonacci' μας:

%load_ext line_profiler

def Φιμπονάτσι ( n ) :

αν n <= 1 :

ΕΠΙΣΤΡΟΦΗ n

αλλού :

ΕΠΙΣΤΡΟΦΗ Φιμπονάτσι ( n - 1 ) + Φιμπονάτσι ( n - 2 )

%lprun -f Fibonacci Fibonacci ( 30 )

Αυτό το απόσπασμα ξεκινά με τη φόρτωση της επέκτασης 'line_profiler', ορίζει τη συνάρτηση 'fibonacci' και, τέλος, χρησιμοποιεί το '%lprun' για το προφίλ της συνάρτησης 'fibonacci' με 'n=30'. Προσφέρει μια τμηματοποίηση γραμμή προς γραμμή των χρόνων εκτέλεσης, καθαρίζοντας ακριβώς πού ξοδεύει τους πόρους του ο κώδικάς μας.

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

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

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

Για να εφαρμόσουμε την απομνημόνευση στη συνάρτηση Fibonacci, γράφουμε τον ακόλουθο κώδικα:

# Λεξικό για την αποθήκευση υπολογισμένων αριθμών Fibonacci
fib_cache = { }
def Φιμπονάτσι ( n ) :
αν n <= 1 :
ΕΠΙΣΤΡΟΦΗ n
# Ελέγξτε εάν το αποτέλεσμα είναι ήδη αποθηκευμένο στην προσωρινή μνήμη
αν n σε fib_cache:
ΕΠΙΣΤΡΟΦΗ fib_cache [ n ]
αλλού :
# Υπολογίστε και αποθηκεύστε το αποτέλεσμα
fib_cache [ n ] = Φιμπονάτσι ( n - 1 ) + Φιμπονάτσι ( n - 2 )
ΕΠΙΣΤΡΟΦΗ fib_cache [ n ] ,

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

Επανάληψη του προφίλ και της βελτιστοποίησης

Μετά την εφαρμογή της βελτιστοποίησης (απομνημόνευση στην περίπτωσή μας), είναι σημαντικό να επαναλάβουμε τη διαδικασία δημιουργίας προφίλ για να γνωρίζουμε τον αντίκτυπο των αλλαγών μας και να διασφαλίσουμε ότι βελτιώσαμε την απόδοση του κώδικα.

Προφίλ μετά τη βελτιστοποίηση

Μπορούμε να χρησιμοποιήσουμε τα ίδια εργαλεία δημιουργίας προφίλ, «cProfile» και «line_profiler», για να δημιουργήσουμε προφίλ της βελτιστοποιημένης συνάρτησης Fibonacci. Συγκρίνοντας τα νέα αποτελέσματα προφίλ με τα προηγούμενα, μπορούμε να μετρήσουμε την αποτελεσματικότητα της βελτιστοποίησής μας.

Δείτε πώς μπορούμε να προφίλ της βελτιστοποιημένης συνάρτησης 'fibonacci' χρησιμοποιώντας το 'cProfile':

cprofiler = cΠροφίλ. Προφίλ ( )

cprofiler. επιτρέπω ( )

αποτέλεσμα = Φιμπονάτσι ( 30 )

cprofiler. καθιστώ ανίκανο ( )

cprofiler. print_stats ( είδος = 'σωρευτικός' )

Χρησιμοποιώντας το 'line_profiler', κάνουμε το προφίλ γραμμή προς γραμμή:

%lprun -f Fibonacci Fibonacci ( 30 )

Κώδικας:

# Λεξικό για την αποθήκευση υπολογισμένων αριθμών Fibonacci
fib_cache = { }

def Φιμπονάτσι ( n ) :
αν n <= 1 :
ΕΠΙΣΤΡΟΦΗ n
# Ελέγξτε εάν το αποτέλεσμα είναι ήδη αποθηκευμένο στην προσωρινή μνήμη
αν n σε fib_cache:
ΕΠΙΣΤΡΟΦΗ fib_cache [ n ]
αλλού :
# Υπολογίστε και αποθηκεύστε το αποτέλεσμα
fib_cache [ n ] = Φιμπονάτσι ( n - 1 ) + Φιμπονάτσι ( n - 2 )
ΕΠΙΣΤΡΟΦΗ fib_cache [ n ]
cprofiler = cΠροφίλ. Προφίλ ( )
cprofiler. επιτρέπω ( )

αποτέλεσμα = Φιμπονάτσι ( 30 )

cprofiler. καθιστώ ανίκανο ( )
cprofiler. print_stats ( είδος = 'σωρευτικός' )
%lprun -f Fibonacci Fibonacci ( 30 )

Για την ανάλυση των αποτελεσμάτων του προφίλ μετά τη βελτιστοποίηση, θα μειωθούν σημαντικά οι χρόνοι εκτέλεσης, ειδικά για μεγάλες τιμές 'n'. Λόγω της απομνημόνευσης, παρατηρούμε ότι η συνάρτηση ξοδεύει τώρα πολύ λιγότερο χρόνο στον επανυπολογισμό των αριθμών Fibonacci.

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

συμπέρασμα

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