Come posso determinare la dimensione di un oggetto in Python?


685

Voglio sapere come ottenere dimensioni di oggetti come una stringa, un numero intero, ecc. In Python.

Domanda correlata: quanti byte per elemento ci sono in un elenco Python (tupla)?

Sto usando un file XML che contiene campi di dimensioni che specificano la dimensione del valore. Devo analizzare questo XML e fare la mia codifica. Quando voglio cambiare il valore di un determinato campo, controllerò il campo della dimensione di quel valore. Qui voglio confrontare se il nuovo valore che sto per inserire è della stessa dimensione di XML. Devo controllare la dimensione del nuovo valore. Nel caso di una stringa posso dire che è la lunghezza. Ma in caso di int, float, ecc. Sono confuso.

Risposte:


665

Basta usare la funzione sys.getsizeof definita nel sysmodulo.

sys.getsizeof(object[, default]):

Restituisce la dimensione di un oggetto in byte. L'oggetto può essere qualsiasi tipo di oggetto. Tutti gli oggetti incorporati restituiranno risultati corretti, ma ciò non deve valere per le estensioni di terze parti poiché è specifico dell'implementazione.

L' defaultargomento consente di definire un valore che verrà restituito se il tipo di oggetto non fornisce mezzi per recuperare la dimensione e causare a TypeError.

getsizeofchiama il __sizeof__metodo dell'oggetto e aggiunge un overhead del Garbage Collector aggiuntivo se l'oggetto è gestito dal Garbage Collector.

Esempio di utilizzo, in Python 3.0:

>>> import sys
>>> x = 2
>>> sys.getsizeof(x)
24
>>> sys.getsizeof(sys.getsizeof)
32
>>> sys.getsizeof('this')
38
>>> sys.getsizeof('this also')
48

Se sei in python <2.6 e non ce l' sys.getsizeofhai, puoi usare questo esteso modulo . Non l'ho mai usato però.


182
Aggiungi al disclaimer che non sarà valido per oggetti nidificati o dadi o dadi annidati in elenchi ecc.
JohnnyM

8
@ChaimG è perché ogni oggetto usa solo 32 byte !! Il resto sono riferimenti ad altri oggetti. Se vuoi tenere conto degli oggetti referenziati devi definire il __sizeof__metodo per la tua classe. La dictclasse Python integrata lo definisce, ecco perché ottieni il risultato corretto quando usi un oggetto di tipo dict.
nosklo,

19
Il disclaimer e le eccezioni a questo funzionamento coprono quasi tutti i casi d'uso che rendono la getsizeoffunzione di scarso valore pronta all'uso .
Robino,

7
perché l'intero 2 è memorizzato in 24 byte?
Saher Ahwal,

4
@SaherAhwal non è solo un numero intero, ma un oggetto completo con metodi, attributi, indirizzi ...
nosklo

372

Come posso determinare la dimensione di un oggetto in Python?

La risposta "Usa solo sys.getsizeof" non è una risposta completa.

Quella risposta non lavoro per incorporato oggetti direttamente, ma non tiene conto di ciò che questi oggetti possono contenere, in particolare, quali tipi, come ad esempio oggetti personalizzati, tuple, liste, dicts e set contengono. Possono contenere istanze reciproche, nonché numeri, stringhe e altri oggetti.

Una risposta più completa

Usando Python 3.6 a 64 bit dalla distribuzione Anaconda, con sys.getsizeof, ho determinato la dimensione minima dei seguenti oggetti, e noto che set e dadi preallocano lo spazio in modo che quelli vuoti non crescano di nuovo fino a dopo un determinato importo (che può varia in base all'implementazione della lingua):

Python 3:

Empty
Bytes  type        scaling notes
28     int         +4 bytes about every 30 powers of 2
37     bytes       +1 byte per additional byte
49     str         +1-4 per additional character (depending on max width)
48     tuple       +8 per additional item
64     list        +8 for each additional
224    set         5th increases to 736; 21nd, 2272; 85th, 8416; 341, 32992
240    dict        6th increases to 368; 22nd, 1184; 43rd, 2280; 86th, 4704; 171st, 9320
136    func def    does not include default args and other attrs
1056   class def   no slots 
56     class inst  has a __dict__ attr, same scaling as dict above
888    class def   with slots
16     __slots__   seems to store in mutable tuple-like structure
                   first slot grows to 48, and so on.

Come lo interpreti? Bene, supponiamo che tu abbia un set con 10 oggetti. Se ogni elemento è di 100 byte ciascuno, quanto è grande l'intera struttura dei dati? Il set è 736 stesso perché è stato ridimensionato una volta a 736 byte. Quindi aggiungi la dimensione degli elementi, quindi sono 1736 byte in totale

Alcune avvertenze per le definizioni di funzioni e classi:

Nota ogni definizione di classe ha una struttura proxy __dict__(48 byte) per attrs di classe. Ogni slot ha un descrittore (come a property) nella definizione della classe.

Le istanze con slot iniziano con 48 byte sul loro primo elemento e aumentano di 8 ogni ulteriore. Solo gli oggetti con slot vuoti hanno 16 byte e un'istanza senza dati non ha molto senso.

Inoltre, ogni definizione di funzione ha oggetti di codice, forse dotstring e altri possibili attributi, persino a __dict__.

Si noti inoltre che utilizziamo sys.getsizeof()perché ci preoccupiamo dell'utilizzo dello spazio marginale, che include l'overhead della garbage collection per l'oggetto, dai documenti :

getsizeof () chiama il __sizeof__metodo dell'oggetto e aggiunge un overhead del Garbage Collector aggiuntivo se l'oggetto è gestito dal Garbage Collector.

Si noti inoltre che il ridimensionamento degli elenchi (ad es. Aggiungendoli ripetutamente) li induce a preallocare lo spazio, in modo simile a set e dadi. Dal codice sorgente listobj.c :

    /* This over-allocates proportional to the list size, making room
     * for additional growth.  The over-allocation is mild, but is
     * enough to give linear-time amortized behavior over a long
     * sequence of appends() in the presence of a poorly-performing
     * system realloc().
     * The growth pattern is:  0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
     * Note: new_allocated won't overflow because the largest possible value
     *       is PY_SSIZE_T_MAX * (9 / 8) + 6 which always fits in a size_t.
     */
    new_allocated = (size_t)newsize + (newsize >> 3) + (newsize < 9 ? 3 : 6);

Dati storici

Analisi Python 2.7, confermata con guppy.hpye sys.getsizeof:

Bytes  type        empty + scaling notes
24     int         NA
28     long        NA
37     str         + 1 byte per additional character
52     unicode     + 4 bytes per additional character
56     tuple       + 8 bytes per additional item
72     list        + 32 for first, 8 for each additional
232    set         sixth item increases to 744; 22nd, 2280; 86th, 8424
280    dict        sixth item increases to 1048; 22nd, 3352; 86th, 12568 *
120    func def    does not include default args and other attrs
64     class inst  has a __dict__ attr, same scaling as dict above
16     __slots__   class with slots has no dict, seems to store in 
                   mutable tuple-like structure.
904    class def   has a proxy __dict__ structure for class attrs
104    old class   makes sense, less stuff, has real dict though.

Nota che i dizionari ( ma non i set ) hanno ottenuto una rappresentazione più compatta in Python 3.6

Penso che 8 byte per ogni elemento aggiuntivo a cui fare riferimento abbiano molto senso su una macchina a 64 bit. Questi 8 byte indicano il punto in cui si trova l'oggetto contenuto. I 4 byte sono a larghezza fissa per Unicode in Python 2, se ricordo bene, ma in Python 3, str diventa un Unicode di larghezza uguale alla larghezza massima dei caratteri.

(E per ulteriori informazioni sulle slot, vedi questa risposta )

Una funzione più completa

Vogliamo una funzione che cerchi gli elementi in elenchi, tuple, insiemi, dicts, obj.__dict__'s e obj.__slots__, così come altre cose che potremmo non aver ancora pensato.

Vogliamo fare affidamento su gc.get_referentsquesta ricerca perché funziona a livello C (rendendolo molto veloce). Il rovescio della medaglia è che get_referents può restituire membri ridondanti, quindi dobbiamo assicurarci di non raddoppiare il conteggio.

Classi, moduli e funzioni sono singoli, esistono una volta nella memoria. Non siamo così interessati alle loro dimensioni, poiché non c'è molto che possiamo fare al riguardo: fanno parte del programma. Quindi eviteremo di contarli se si verificano riferimenti.

Utilizzeremo una lista nera di tipi in modo da non includere l'intero programma nel conteggio delle dimensioni.

import sys
from types import ModuleType, FunctionType
from gc import get_referents

# Custom objects know their class.
# Function objects seem to know way too much, including modules.
# Exclude modules as well.
BLACKLIST = type, ModuleType, FunctionType


def getsize(obj):
    """sum size of object & members."""
    if isinstance(obj, BLACKLIST):
        raise TypeError('getsize() does not take argument of type: '+ str(type(obj)))
    seen_ids = set()
    size = 0
    objects = [obj]
    while objects:
        need_referents = []
        for obj in objects:
            if not isinstance(obj, BLACKLIST) and id(obj) not in seen_ids:
                seen_ids.add(id(obj))
                size += sys.getsizeof(obj)
                need_referents.append(obj)
        objects = get_referents(*need_referents)
    return size

Per contrastare questo con la seguente funzione autorizzata, la maggior parte degli oggetti sa come attraversarsi ai fini della garbage collection (che è approssimativamente ciò che stiamo cercando quando vogliamo sapere quanto costosi sono in memoria determinati oggetti. Questa funzionalità è utilizzata da gc.get_referents.) Tuttavia, questa misura avrà una portata molto più ampia di quanto intendessimo se non stiamo attenti.

Ad esempio, le funzioni sanno molto sui moduli in cui sono create.

Un altro punto di contrasto è che le stringhe che sono chiavi nei dizionari sono di solito internate in modo da non essere duplicate. Il controllo id(key)ci consentirà anche di evitare il conteggio dei duplicati, cosa che facciamo nella sezione successiva. La soluzione della lista nera salta il conteggio delle chiavi che sono del tutto stringhe.

Tipi autorizzati, Visitatore ricorsivo (implementazione precedente)

Per coprire la maggior parte di questi tipi da solo, invece di fare affidamento sul modulo gc, ho scritto questa funzione ricorsiva per provare a stimare la dimensione della maggior parte degli oggetti Python, inclusi la maggior parte dei builtin, i tipi nel modulo collezioni e i tipi personalizzati (scanalati e non) .

Questo tipo di funzione offre un controllo molto più preciso sui tipi che contiamo per l'utilizzo della memoria, ma ha il pericolo di escludere i tipi:

import sys
from numbers import Number
from collections import Set, Mapping, deque

try: # Python 2
    zero_depth_bases = (basestring, Number, xrange, bytearray)
    iteritems = 'iteritems'
except NameError: # Python 3
    zero_depth_bases = (str, bytes, Number, range, bytearray)
    iteritems = 'items'

def getsize(obj_0):
    """Recursively iterate to sum size of object & members."""
    _seen_ids = set()
    def inner(obj):
        obj_id = id(obj)
        if obj_id in _seen_ids:
            return 0
        _seen_ids.add(obj_id)
        size = sys.getsizeof(obj)
        if isinstance(obj, zero_depth_bases):
            pass # bypass remaining control flow and return
        elif isinstance(obj, (tuple, list, Set, deque)):
            size += sum(inner(i) for i in obj)
        elif isinstance(obj, Mapping) or hasattr(obj, iteritems):
            size += sum(inner(k) + inner(v) for k, v in getattr(obj, iteritems)())
        # Check for custom object instances - may subclass above too
        if hasattr(obj, '__dict__'):
            size += inner(vars(obj))
        if hasattr(obj, '__slots__'): # can have __slots__ with __dict__
            size += sum(inner(getattr(obj, s)) for s in obj.__slots__ if hasattr(obj, s))
        return size
    return inner(obj_0)

E l'ho testato piuttosto casualmente (dovrei smontarlo):

>>> getsize(['a', tuple('bcd'), Foo()])
344
>>> getsize(Foo())
16
>>> getsize(tuple('bcd'))
194
>>> getsize(['a', tuple('bcd'), Foo(), {'foo': 'bar', 'baz': 'bar'}])
752
>>> getsize({'foo': 'bar', 'baz': 'bar'})
400
>>> getsize({})
280
>>> getsize({'foo':'bar'})
360
>>> getsize('foo')
40
>>> class Bar():
...     def baz():
...         pass
>>> getsize(Bar())
352
>>> getsize(Bar().__dict__)
280
>>> sys.getsizeof(Bar())
72
>>> getsize(Bar.__dict__)
872
>>> sys.getsizeof(Bar.__dict__)
280

Questa implementazione si suddivide in definizioni di classe e definizioni di funzioni perché non seguiamo tutti i loro attributi, ma poiché dovrebbero esistere solo una volta in memoria per il processo, le loro dimensioni non contano molto.


5
Potresti aggiungere che questa risposta è specifica per CPython (il che è implicito nel far ottenere Python tramite Anaconda)
gerrit

1
CPython è l'implementazione di riferimento e ho appena esaminato i documenti online di jython che forniscono la stessa API, quindi credo che funzionerà su altre implementazioni, purché implementino le API.
Aaron Hall

per me non ha funzionato per mascherato e gli array NumPy mascherate stackoverflow.com/q/58675479/2132157~~V~~plural~~3rd
GM

96

Il modulo del pacchetto Pymplerasizeof può farlo.

Utilizzare come segue:

from pympler import asizeof
asizeof.asizeof(my_object)

A differenza sys.getsizeof, funziona per i tuoi oggetti creati da te . Funziona anche con numpy.

>>> asizeof.asizeof(tuple('bcd'))
200
>>> asizeof.asizeof({'foo': 'bar', 'baz': 'bar'})
400
>>> asizeof.asizeof({})
280
>>> asizeof.asizeof({'foo':'bar'})
360
>>> asizeof.asizeof('foo')
40
>>> asizeof.asizeof(Bar())
352
>>> asizeof.asizeof(Bar().__dict__)
280
>>> A = rand(10)
>>> B = rand(10000)
>>> asizeof.asizeof(A)
176
>>> asizeof.asizeof(B)
80096

Come detto ,

La dimensione del codice (byte) di oggetti come classi, funzioni, metodi, moduli, ecc. Può essere inclusa impostando l'opzione code=True.

E se hai bisogno di un'altra vista sui dati in tempo reale, Pympler's

Il modulo muppyviene utilizzato per il monitoraggio online di un'applicazione Python e il modulo Class Trackerfornisce analisi offline della durata degli oggetti Python selezionati.


questa funzione è piuttosto lenta per oggetti più grandi. Esiste un equivalente "veloce" che funziona per gli oggetti creati da sé?
Shuklaswag,

Non l'ho ancora testato, ma org.apache.spark.util.SizeEstimatorpotrebbe essere rilevante
Shuklaswag l'

1
@ Shuklaswag: se usi spark, potrebbe anche esserlo. Pensi che la stima di conversione + Java sia più rapida dei metodi integrati di Python? O ho frainteso?
serv-inc,

3
Potrebbe valere la pena notare che pymplerha le capacità di prendere in considerazione la dimensione del codice eseguibile delle funzioni e altri callable e oggetti di codice.
mtraceur,

Ottengo TypeErrorun'eccezione: "L'oggetto 'NoneType' non è richiamabile" ogni volta che il mio oggetto personalizzato ha un oggetto secondario nel suo "albero" con valore None. C'è qualche soluzione rapida per questo?
James Hirschorn,

81

Per gli array intorpiditi, getsizeofnon funziona - per me restituisce sempre 40 per qualche motivo:

from pylab import *
from sys import getsizeof
A = rand(10)
B = rand(10000)

Quindi (in ipython):

In [64]: getsizeof(A)
Out[64]: 40

In [65]: getsizeof(B)
Out[65]: 40

Fortunatamente, però:

In [66]: A.nbytes
Out[66]: 80

In [67]: B.nbytes
Out[67]: 80000

29
> Tutti gli oggetti incorporati restituiranno risultati corretti, ma ciò non deve valere per le estensioni di terze parti poiché è specifico dell'implementazione. docs.python.org/library/sys.html#sys.getsizeof
warvariuc

33
"Se si utilizza un array numpy ( docs.scipy.org/doc/numpy/reference/arrays.ndarray.html ), è possibile utilizzare l'attributo 'ndarray.nbytes' per valutarne le dimensioni in memoria." stackoverflow.com/a/15591157/556413
glarrain

17
Immagino che 40 byte siano corretti, tuttavia getsizeof()ti dà solo la dimensione dell'oggetto (l'intestazione dell'array), non dei dati all'interno. Lo stesso vale per i contenitori in pitone dove sys.getsizeof([1,2,4]) == sys.getsizeof([1,123**456,4]) == 48, mentresys.getsizeof(123**456) = 436
yota,

3
Sembra che la getsizeof()funzione sia stata modificata ad un certo punto per restituire il valore previsto.
dshin,

16

Python 3.8 (Q1 2019) cambierà alcuni dei risultati di sys.getsizeof, come annunciato qui da Raymond Hettinger:

I contenitori Python sono 8 byte più piccoli su build a 64 bit.

tuple ()  48 -> 40       
list  []  64 ->56
set()    224 -> 216
dict  {} 240 -> 232

Questo viene dopo il numero 33597 e il lavoro di Inada Naoki ( methane) su Compact PyGC_Head e PR 7043

Questa idea riduce la dimensione di PyGC_Head a due parole .

Attualmente, PyGC_Head richiede tre parole ; gc_prev, gc_nexte gc_refcnt.

  • gc_refcnt viene utilizzato durante la raccolta, per l'eliminazione di prova.
  • gc_prev è usato per tracciare e non tracciare.

Quindi, se possiamo evitare il tracciamento / non tracciamento durante l'eliminazione di prova gc_preve gc_refcntpossiamo condividere lo stesso spazio di memoria.

Vedi commit d5c875b :

Rimosso un Py_ssize_tmembro da PyGC_Head.
La dimensione di tutti gli oggetti tracciati GC (ad es. Tupla, elenco, dettatura) è ridotta di 4 o 8 byte.


14

Questo può essere più complicato di quanto sembri a seconda di come vuoi contare le cose. Ad esempio, se si dispone di un elenco di ints, si desidera la dimensione dell'elenco contenente i riferimenti agli ints? (ad es. elenca solo, non ciò che è contenuto in esso) o vuoi includere i dati effettivi indicati, nel qual caso devi trattare riferimenti duplicati e come evitare il doppio conteggio quando due oggetti contengono riferimenti a lo stesso oggetto.

Potresti dare un'occhiata a uno dei profili di memoria di Python, come pysizer per vedere se soddisfano le tue esigenze.


10

Avendo riscontrato questo problema molte volte, ho scritto una piccola funzione (ispirata alla risposta di @ aaron-hall) e test che fanno ciò che mi sarei aspettato che facesse sys.getsizeof:

https://github.com/bosswissam/pysize

Se sei interessato al retroscena, eccolo qui

EDIT: allegando il codice qui sotto per un facile riferimento. Per vedere il codice più aggiornato, controlla il link github.

    import sys

    def get_size(obj, seen=None):
        """Recursively finds size of objects"""
        size = sys.getsizeof(obj)
        if seen is None:
            seen = set()
        obj_id = id(obj)
        if obj_id in seen:
            return 0
        # Important mark as seen *before* entering recursion to gracefully handle
        # self-referential objects
        seen.add(obj_id)
        if isinstance(obj, dict):
            size += sum([get_size(v, seen) for v in obj.values()])
            size += sum([get_size(k, seen) for k in obj.keys()])
        elif hasattr(obj, '__dict__'):
            size += get_size(obj.__dict__, seen)
        elif hasattr(obj, '__iter__') and not isinstance(obj, (str, bytes, bytearray)):
            size += sum([get_size(i, seen) for i in obj])
        return size

7

Ecco uno script veloce che ho scritto in base alle risposte precedenti per elencare le dimensioni di tutte le variabili

for i in dir():
    print (i, sys.getsizeof(eval(i)) )

Non è sbagliato, è ambiguo. sys.getsizeof restituirà sempre il valore necessario, quindi non è necessario perdere le prestazioni con try..except.
der_fenix,

oh, questo è un buon punto e non ci ho pensato - il codice nella forma in cui è adesso mostra solo come è stato cronologicamente scritto - prima ho saputo di numpy (quindi nbyte), poi ho cercato una soluzione più generica . Grazie per la spiegazione _ / \ _
alexey

7

È possibile serializzare l'oggetto per derivare una misura strettamente correlata alla dimensione dell'oggetto:

import pickle

## let o be the object, whose size you want to measure
size_estimate = len(pickle.dumps(o))

Se vuoi misurare oggetti che non possono essere decapati (ad es. A causa di espressioni lambda) cloudpickle può essere una soluzione.


4

Utilizzare sys.getsizeof () se NON si desidera includere dimensioni di oggetti collegati (nidificati).

Tuttavia, se si desidera contare gli oggetti secondari nidificati in elenchi, dicts, set, tuple - e di solito QUESTO è ciò che si sta cercando - utilizzare la funzione recursive deep sizeof () come mostrato di seguito:

import sys
def sizeof(obj):
    size = sys.getsizeof(obj)
    if isinstance(obj, dict): return size + sum(map(sizeof, obj.keys())) + sum(map(sizeof, obj.values()))
    if isinstance(obj, (list, tuple, set, frozenset)): return size + sum(map(sizeof, obj))
    return size

È inoltre possibile trovare questa funzione nella casella degli strumenti elegante , insieme a molte altre utili righe singole:

https://github.com/mwojnars/nifty/blob/master/util.py


3

Se non hai bisogno delle dimensioni esatte dell'oggetto ma approssimativamente per sapere quanto è grande, un modo rapido (e sporco) è quello di far funzionare il programma, dormire per un lungo periodo di tempo e controllare l'utilizzo della memoria (es : Monitor dell'attività di Mac) con questo particolare processo Python. Ciò sarebbe efficace quando stai cercando di trovare la dimensione di un singolo oggetto di grandi dimensioni in un processo Python. Ad esempio, recentemente ho voluto verificare l'utilizzo della memoria di una nuova struttura di dati e confrontarla con quella della struttura di dati impostata di Python. Prima ho scritto gli elementi (parole di un grande libro di dominio pubblico) su un set, poi ho controllato le dimensioni del processo e poi ho fatto la stessa cosa con l'altra struttura di dati. Ho scoperto che il processo Python con un set richiede il doppio della memoria rispetto alla nuova struttura di dati. Ancora una volta, non avresti essere in grado di dire esattamente che la memoria utilizzata dal processo è uguale alla dimensione dell'oggetto. Man mano che la dimensione dell'oggetto aumenta, questa si avvicina man mano che la memoria consumata dal resto del processo diventa trascurabile rispetto alla dimensione dell'oggetto che si sta tentando di monitorare.


1
La domanda si pone come farlo in Python , non solo trovare l'utilizzo della memoria degli oggetti Python e usare un monitor attività Mac o qualsiasi altro software simile non sta programmando usando Python. Detto questo, controllare l'utilizzo della memoria dei processi Python in questo modo in generale è un buon modo per assicurarsi che nulla sia andato storto ...
Tom Wyllie

@TomWyllie, grazie, ma il downgrade di questa risposta porta la connotazione negativa che la risposta stessa è sbagliata e non realizza nulla. Il metodo che cito potrebbe non essere implementato in Python, ma è un modo pratico per ottenere una stima approssimativa di una dimensione di un oggetto Python. Sapevo di non rispondere alla domanda esatta, tuttavia, il metodo potrebbe essere utile per qualcun altro per ottenere un risultato simile.
picmate 涅

1

È possibile utilizzare getSizeof () come indicato di seguito per determinare la dimensione di un oggetto

import sys
str1 = "one"
int_element=5
print("Memory size of '"+str1+"' = "+str(sys.getsizeof(str1))+ " bytes")
print("Memory size of '"+ str(int_element)+"' = "+str(sys.getsizeof(int_element))+ " bytes")

0

Uso questo trucco ... Potrebbe non essere accurato su piccoli oggetti, ma penso che sia molto più preciso per un oggetto complesso (come la superficie di un gioco) piuttosto che sys.getsizeof ()

import pygame as pg
import os
import psutil
import time


process = psutil.Process(os.getpid())
pg.init()    
vocab = ['hello', 'me', 'you', 'she', 'he', 'they', 'we',
         'should', 'why?', 'necessarily', 'do', 'that']

font = pg.font.SysFont("monospace", 100, True)

dct = {}

newMem = process.memory_info().rss  # don't mind this line
Str = f'store ' + f'Nothing \tsurface use about '.expandtabs(15) + \
      f'0\t bytes'.expandtabs(9)  # don't mind this assignment too

usedMem = process.memory_info().rss

for word in vocab:
    dct[word] = font.render(word, True, pg.Color("#000000"))

    time.sleep(0.1)  # wait a moment

    # get total used memory of this script:
    newMem = process.memory_info().rss
    Str = f'store ' + f'{word}\tsurface use about '.expandtabs(15) + \
          f'{newMem - usedMem}\t bytes'.expandtabs(9)

    print(Str)
    usedMem = newMem

Sul mio Windows 10, Python 3.7.3, l'output è:

store hello          surface use about 225280    bytes
store me             surface use about 61440     bytes
store you            surface use about 94208     bytes
store she            surface use about 81920     bytes
store he             surface use about 53248     bytes
store they           surface use about 114688    bytes
store we             surface use about 57344     bytes
store should         surface use about 172032    bytes
store why?           surface use about 110592    bytes
store necessarily    surface use about 311296    bytes
store do             surface use about 57344     bytes
store that           surface use about 110592    bytes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.