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

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

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

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

instagram viewer

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

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

Για να ξεκινήσετε, εγκαταστήστε memory_profiler στο εικονικό σας περιβάλλον Python. Εγκαθίσταται και αυτό ψουτίλ.

pip install memory_profiler

Λάβετε το μέγεθος ενός αντικειμένου στη μνήμη

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

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

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

ο sys.getsizeof Η ενσωματωμένη μέθοδος είναι χρήσιμη εδώ:

εισαγωγή sys
Τυπώνω(f"μέγεθος λίστας: {sys.getsizeof([])} bytes")
Τυπώνω(f"μέγεθος λεξικού: {sys.getsizeof (dict)} bytes")
Τυπώνω(f"μεγέθης πλειάδας: {sys.getsizeof(())} bytes")
Τυπώνω(f" set size: {sys.getsizeof({})} byte")

Εδώ είναι η έξοδος:

Μπορείτε επίσης να χρησιμοποιήσετε το sys.getsizeof μέθοδος σύγκρισης του μεγέθους της μνήμης μιας ενσωματωμένης και προσαρμοσμένης συνάρτησης.

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

εισαγωγή sys

defgetLength(επαναλαμβανόμενο):
καταμέτρηση = 0

Για Εγώ σε επαναλαμβανόμενο:
μετρήστε +=1

ΕΠΙΣΤΡΟΦΗ μετρώ

Τυπώνω(f"Ενσωματωμένη λειτουργία μήκους: {sys.getsizeof (len)} bytes")
Τυπώνω(f"Λειτουργία προσαρμοσμένου μήκους: {sys.getsizeof (getLength)} bytes")

Ο παραπάνω κώδικας δίνει την ακόλουθη έξοδο:

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

Βρείτε το προφίλ μνήμης μιας συνάρτησης Python

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

εισαγωγή παντα
εισαγωγή numpy
από το προφίλ εισαγωγής memory_profiler

class Manipulate:
@Προφίλ
def manipulateData (self):
df = πάντα. Πλαίσιο δεδομένων({
'A' :[0, 3, numpy.nan, 10, 3, numpy.nan],
'B': [numpy.nan, "Pandas", numpy.nan, "Pandas", "Python", "JavaScript"],
})

df.fillna (method='bfill', inplace=True)
df.fillna (method='ffill', inplace=True)
οδός επιστροφής (df)

χειραγώγηση = Χειρισμός ()
εκτύπωση (manip.manipulateData())

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

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

Για παράδειγμα, στην παραπάνω έξοδο, η γραμμή 11 εμφανίστηκε δύο φορές με αύξηση μνήμης 0,1 MiB (Mebibyte), αυξάνοντας τη χρήση μνήμης στα 55,4 MiB. Οι γραμμές 19 και 22 συνεισέφεραν επίσης 0,2 MiB και 0,3 MiB, αντίστοιχα, ανεβάζοντας συνολικά τη χρήση μνήμης σε 55,9 MiB.

Βρείτε το προφίλ μνήμης ενός σεναρίου Python από τη χρονική σήμανση

Μπορείτε επίσης να υπολογίσετε το προφίλ μνήμης ενός ολόκληρου σεναρίου Python χρησιμοποιώντας το memory_profiler τρέχοντας το μπροφ εντολή στο τερματικό όπως φαίνεται:

mprof εκτελέστε το script_name.py

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

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

Μπορείτε επίσης να πάρετε μια γραφική παράσταση του προφίλ μνήμης. Αυτό απαιτεί εγκατάσταση του matplotlib:

εγκατάσταση pip matplotlib

Μόλις εγκατασταθεί, εκτελέστε το μπροφ εντολή ως εξής:

μπροφ οικόπεδο

Ακολουθεί η έξοδος σε αυτήν την περίπτωση:

Εκτελέστε το προφίλ μνήμης σεναρίου σε ένα αποκλειστικό αρχείο Python

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

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

εισαγωγή υποδιεργασία

subprocess.run([
"καθηγητής", 'τρέξιμο', "--περιλαμβάνω-παιδιά", 'missing.py'
])

# αποθηκεύστε την έξοδο της γραφικής παράστασης τοπικά
subprocess.run(["καθηγητής", 'οικόπεδο', '--output=output.jpg'])

Για να εκτελέσετε το προφίλ μνήμης του σεναρίου, χρειάζεται μόνο να εκτελέσετε το αρχείο Python που περιέχει τον παραπάνω κώδικα. Αυτό δημιουργεί μια γραφική παράσταση προφίλ μνήμης (output.jpg) στον κατάλογο αρχείων:

Βρείτε το ποσό της μνήμης που χρησιμοποιείται από μια εκτέλεση συνάρτησης

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

Για παράδειγμα, για να δημιουργήσετε προφίλ στο προηγούμενο Χειρισμός Pandas DataFrame μέθοδος μέσα σε άλλο αρχείο Python:

εισαγωγή ψουτίλ
εισαγωγή sys
εισαγωγή os
sys.path.append (sys.path[0] + "/..")

# εισαγάγετε την κλάση που περιέχει τη μέθοδό σας
από κάποιος κωδικός.λείπει εισαγωγή Χειραγωγώ

# δημιουργήστε την τάξη
χειραγώγηση = Χειρισμός ()

διεργασία = ψουτίλ. Διαδικασία (os.getpid())
αρχική_μνήμη = διεργασία.memory_info().rss

# εκτελέστε τη μέθοδο στόχο:
manip.manipulateData()

# λάβετε τις πληροφορίες μνήμης μετά την εκτέλεση
final_memory = process.memory_info().rss
memory_consumed = τελική_μνήμη - αρχική_μνήμη
memory_consumed_mb = memory_consumed / (1024 * 1024)
Τυπώνω(f"Μνήμη που καταναλώνεται από τη λειτουργία: {memory_consumed_mb:.2φά} MB")

Το παραπάνω εκτιμά το συνολικό προφίλ μνήμης της μεθόδου σε megabyte (MB) όπως φαίνεται:

Βρείτε το προφίλ μνήμης μιας γραμμής κώδικα στο σημειωματάριο Jupyter

Εάν χρησιμοποιείτε το iPython στο Jupyter Notebook, μπορείτε να υπολογίσετε το προφίλ μνήμης ενός one-liner χρησιμοποιώντας το memory_profiler. Χρειάζεται μόνο να φορτώσετε memory_profiler σε ένα κελί. Στη συνέχεια προσθέστε το %memit μαγική λειτουργία στον κώδικά σας στα επόμενα κελιά. Αυτό επιστρέφει τη μέγιστη μνήμη του κώδικα και το αυξημένο μέγεθος.

Αυτή η μέθοδος δεν λειτουργεί με κανονικά σενάρια Python εκτός από το iPython στο Jupyter Notebook.

Για παράδειγμα:

Μπορείτε επίσης να χρησιμοποιήσετε το %memit μαγική λειτουργία στο Jypyter Notebook για προφίλ της μνήμης μιας συνάρτησης κατά το χρόνο εκτέλεσης:

Βελτιώστε την απόδοση της μνήμης σας στον κώδικα Python σας

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

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