
Πώς θα πάτε για να μάθετε πόση μνήμη χρησιμοποιείται από ένα αντικείμενο; Ξέρω ότι είναι δυνατόν για να μάθετε πόσο χρησιμοποιείται από ένα μπλοκ κώδικα, αλλά όχι από μια υπόσταση αντικειμένου (οποιαδήποτε στιγμή κατά τη διάρκεια της ζωής του), το οποίο είναι αυτό που θέλω.

 
Μάθετε πόση μνήμη χρησιμοποιείται από ένα αντικείμενο σε Python
===============================================================



**Δεν υπάρχει εύκολος τρόπος για να μάθετε το μέγεθος της μνήμης ενός αντικειμένου python** . Ένα από τα προβλήματα που μπορεί να βρει είναι ότι η Python αντικείμενα - όπως λίστες και DICTS - μπορεί να έχει αναφορές σε άλλα αντικείμενα python (σε αυτή την περίπτωση, τι θα το μέγεθός σας είναι το μέγεθος που περιέχει το μέγεθος του κάθε αντικειμένου ή όχι;). Υπάρχουν μερικοί δείκτες γενικά και οι εσωτερικές δομές που σχετίζονται με την αντίρρηση τους τύπους και τη συλλογή σκουπιδιών. Τέλος, ορισμένα αντικείμενα python έχουν μη-προφανή συμπεριφορές. Για παράδειγμα, αναφέρει χώρο αποθεματικό για περισσότερα αντικείμενα από ό, τι έχουν, τις περισσότερες φορές? DICTS είναι ακόμη πιο περίπλοκη, δεδομένου ότι μπορούν να λειτουργήσουν με διαφορετικούς τρόπους (που έχουν μια διαφορετική εφαρμογή για μικρό αριθμό των κλειδιών και μερικές φορές διαθέσει πάνω από συμμετοχές).


Υπάρχει ένα [μεγάλο κομμάτι του κώδικα](http://code.activestate.com/recipes/544288/) (και μια [ενημερωμένη μεγάλο κομμάτι του κώδικα](http://code.activestate.com/recipes/546530/) ) εκεί έξω για να προσπαθήσει να προσεγγίσει καλύτερα το μέγεθος ενός αντικειμένου πύθωνα στη μνήμη.


Μπορεί επίσης να θέλετε να ελέγξετε κάποια [παλαιά περιγραφή για PyObject](http://mail.python.org/pipermail/python-list/2002-March/135223.html) (την εσωτερική struct C, που αντιπροσωπεύει σχεδόν όλα τα αντικείμενα python).

 

Δεν έχω καμία προσωπική εμπειρία με κάποιο από τα παρακάτω, αλλά μια απλή αναζήτηση για «Python [μνήμη] profiler» απόδοση:


* PySizer, "ένα profiler μνήμης για Python", που βρέθηκαν σε <http://pysizer.8325.org/> . Ωστόσο, η σελίδα φαίνεται να δείχνει ότι το έργο δεν έχει ενημερωθεί για κάποιο χρονικό διάστημα, και αναφέρεται στην ...
* Heapy, «υποστήριξη [ing] εντοπισμό σφαλμάτων και βελτιστοποίηση για θέματα που σχετίζονται με τη μνήμη στα προγράμματα Python», που βρέθηκαν σε <http://guppy-pe.sourceforge.net/#Heapy> .


Ελπίδα που βοηθά.

 

Μια άλλη προσέγγιση είναι η χρήση τουρσί. Δείτε [την απάντηση](https://stackoverflow.com/a/565382/420867) σε ένα αντίγραφο αυτού του ερωτήματος.

 

Δοκιμάστε αυτό:



```
sys.getsizeof(object)

```

[getsizeof ()](https://docs.python.org/3/library/sys.html#sys.getsizeof) καλεί του αντικειμένου `__sizeof__`μέθοδο και προσθέτει μια πρόσθετη επιβάρυνση συλλέκτη σκουπιδιών **, αν** το αντικείμενο διοικείται από τον συλλέκτη σκουπιδιών.


[Μια αναδρομική συνταγή](http://code.activestate.com/recipes/577504/)

 

Αυτό θα πρέπει να χρησιμοποιείται με προσοχή, γιατί η παράκαμψη στα αντικείμενα \_\_sizeof\_\_ μπορεί να είναι παραπλανητική.


Χρησιμοποιώντας το bregman.suite, κάποιες δοκιμές με sys.getsizeof έξοδο ένα αντίγραφο ενός αντικειμένου συστοιχίας (δεδομένα) σε ένα παράδειγμα αντικειμένου ως μεγαλύτερο από το ίδιο το αντικείμενο (MFCC).



```
>>> mfcc = MelFrequencyCepstrum(filepath, params)
>>> data = mfcc.X[:]
>>> sys.getsizeof(mfcc)
64
>>> sys.getsizeof(mfcc.X)
>>>80
>>> sys.getsizeof(data)
80
>>> mfcc
<bregman.features.MelFrequencyCepstrum object at 0x104ad3e90>

```
 

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


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

 