2009-12-30 9 views
9

¿Las cadenas de docs y los comentarios de Python se almacenan en la memoria cuando se carga un módulo?¿Se almacenan las cadenas de docs y los comentarios de Python en la memoria cuando se carga un módulo?

Me he preguntado si esto es cierto, porque normalmente doy mi documento bien; ¿Puede esto afectar el uso de la memoria?

Por lo general, todos los objetos de Python tienen un método __doc__. ¿Se leen esas cadenas de documentos del archivo o se procesan de otra manera?

He hecho búsquedas aquí en los foros, Google y listas de correo, pero no he encontrado ninguna información relevante.

¿Lo sabes mejor?

+4

Solo para aclarar, los docstrings no son comentarios. Son similares, y sirven para propósitos similares, pero la docstring es en realidad un atributo de la función/objeto, mientras que no creo que los comentarios sean accesibles de ninguna otra manera que no sea la lectura real del archivo .py. – MatrixFrog

+0

¿Cuánta memoria teme que pueda usarse? ¿Más de 1 byte por personaje? ¿Estás programando un Timex Sinclair 1000? –

Respuesta

22

De forma predeterminada, las cadenas de documentos están presentes en el archivo de códigos de bytes .pyc, y se cargan desde ellas (los comentarios no son). Si usa python -OO (la bandera -OO significa "optimizar intensamente", en oposición a -O que significa "optimizar levemente", obtiene y usa archivos .pyo en lugar de .pyc, y estos se optimizan al omitir los documentos (además de . optimizaciones realizadas por los -O, que eliminan assert declaraciones), por ejemplo, consideran un archivo que tiene foo.py:

"""This is the documentation for my module foo.""" 

def bar(x): 
    """This is the documentation for my function foo.bar.""" 
    return x + 1 

usted podría tener la siguiente sesión de shell ...:

$ python -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
This is the documentation for my module foo. 
$ ls -l foo.pyc 
-rw-r--r-- 1 aleax eng 327 Dec 30 16:17 foo.pyc 
$ python -O -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
This is the documentation for my module foo. 
$ ls -l foo.pyo 
-rw-r--r-- 1 aleax eng 327 Dec 30 16:17 foo.pyo 
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
This is the documentation for my module foo. 
$ ls -l foo.pyo 
-rw-r--r-- 1 aleax eng 327 Dec 30 16:17 foo.pyo 
$ rm foo.pyo 
$ python -OO -c'import foo; print foo.bar(22); print foo.__doc__' 
23 
None 
$ ls -l foo.pyo 
-rw-r--r-- 1 aleax eng 204 Dec 30 16:17 foo.pyo 

Tenga en cuenta que, dado que usamos -O primero, el archivo .pyo tenía 327 bytes, incluso después de usar -OO, porque el archivo .pyo todavía estaba presente y Python no lo reconstruyó/sobreescribió, simplemente usó el existente. Eliminar el existente .pyo (o, equivalentemente, touch foo.py para que Python sepa que el .pyo está "desactualizado") significa que Python lo reconstruye (y, en este caso, guarda 123 bytes en el disco, y un poco más cuando el módulo se importó - pero todas las entradas .__doc__ desaparecen y son reemplazadas por None).

+0

Ahora está claro. Muy buena respuesta. –

+0

Por cierto, las cadenas independientes que no son docstrings (no están en la parte superior de las funciones, clases o módulos) generan [sin código] (https://twitter.com/gvanrossum/status/112670605505077248) en cualquier nivel de optimización . No están en los archivos .pyc o .pyo. Son realmente ** comentarios de varias líneas **. –

4

Ellos son siendo leídos desde el archivo (cuando el archivo se compila a pyc o cuando se carga el PYC - deben estar disponibles bajo object.__doc__) pero sin -> Esto no afecta significativamente el rendimiento bajo cualquier circunstancia razonable, ¿o está realmente escribiendo doc-strings multi-megabyte?

+0

+1 respuesta buena y graciosa y ** no **, I * do not * write multi-megabyte doc-strings;) –

7

Sí, las cadenas de documentos se leen del archivo, pero eso no debería impedir que las escriba. Nunca siempre legibilidad de compromiso de código para el rendimiento hasta que haya realizado una prueba de rendimiento y encontró que lo que le preocupa es, de hecho, el cuello de botella en su programa que está causando un problema. Creo que es muy poco probable que una docstring cause un impacto medible en el rendimiento en cualquier situación del mundo real.

1

Do docstrings y comentarios Python se almacenan en la memoria cuando el módulo está cargado ?

Las cadenas de documentos se compilan en el archivo .pyc y se cargan en la memoria.Los comentarios se descartan durante la compilación y no tienen ningún impacto en nada, excepto en el insignificante tiempo adicional necesario para ignorarlos durante la compilación (lo que sucede una vez solo después de cualquier cambio en un archivo .py, excepto el guión principal que se vuelve a compilar cada vez que correr).

También tenga en cuenta que estas cadenas se conservan solo si son las primera cosa en el módulo, definición de clase o definición de función. Puede incluir cadenas adicionales prácticamente en cualquier lugar, pero se descartarán durante la compilación tal como lo hacen los comentarios.

Cuestiones relacionadas