Domanda

Capisco che in Python una stringa è semplicemente un'espressione e una stringa di per sé sarebbe garbage collection immediatamente dopo il ritorno del controllo al chiamante di un codice, ma ...

  1. Grande classe / metodo doc stringhe in codice: fanno a sprecare memoria costruendo la stringa di oggetti in su?
  2. Modulo stringhe livello doc: sono memorizzati infinitamente dall'interprete?

Questo importa nemmeno? La mia unica preoccupazione è venuto da l'idea che se sto utilizzando un grande framework come Django, o più grandi librerie open source, essi tendono ad essere molto ben documentato con potenzialmente più megabyte di testo. In questi casi sono le stringhe doc caricati in memoria per il codice che viene utilizzato lungo la strada, e poi c'è mantenuto, o è raccolto immediatamente come stringhe normali?

È stato utile?

Soluzione

  • "Capisco che in Python una stringa è semplicemente un'espressione e una stringa di per sé sarebbe garbage collection immediatamente dopo il ritorno del controllo al chiamante di un codice" indica un equivoco, credo. Un docstring viene valutata una volta (non su ogni chiamata di funzione) e rimane in vita, almeno fino a quando la funzione di fa.

  • "Fa questo anche la materia?" quando si tratta di ottimizzazione non è risposta da pensarci in astratto, ma misurando. "Più megabyte" del testo non è probabilmente non è un sacco in un'applicazione intensivo della memoria. La soluzione per il salvataggio della memoria probabilmente vive altrove e si può determinare se questo è il caso per la misurazione.

  • di Python riga di comando -OO Rimuove docstring.

Altri suggerimenti

Python docstrings di default sono mantenuti intorno a tempo indeterminato, dato che sono accessibili tramite l'attributo __doc__ di una funzione o di un modulo. Ad esempio, con il seguente in test.py:

"""This is a test module."""

def f():
   """This is a test function."""
   pass

Quindi:

$ python
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__doc__
'This is a test module.'
>>> test.f.__doc__
'This is a test function.'
>>> 

L'opzione -OO all'interprete a quanto pare lo causa per rimuovere docstrings dai file .pyo generati, ma non ha l'effetto mi aspetterei:

$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.py'
>>> 
$ grep "This is a test" /tmp/test.pyo
Binary file /tmp/test.pyo matches
$ python -OO
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.__file__
'/tmp/test.pyo'
>>> test.__doc__
'This is a test module.'
>>> 

E infatti, il file generato con test.pyo -OO è identico al file test.pyc generato senza argomenti della riga di comando. Qualcuno può spiegare questo comportamento?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top