2012-06-12 13 views
16

Tengo un script de python muy grande, 200K, que me gustaría utilizar la menor cantidad de memoria posible. Se ve algo como:Cómo reducir el uso de la memoria de secuencias de comandos de Python

# a lot of data structures 
r = [34, 78, 43, 12, 99] 

# a lot of functions that I use all the time 
def func1(word): 
    return len(word) + 2 

# a lot of functions that I rarely use 
def func1(word): 
    return len(word) + 2 


# my main loop 
while 1: 
    # lots of code 
    # calls functions 

Si pongo las funciones que rara vez se utilizo en un módulo, e importarlos de forma dinámica sólo si es necesario, no puedo acceder a los datos. Eso es todo lo que he conseguido.

Soy nuevo en python.

¿Alguien puede ponerme en el camino correcto? ¿Cómo puedo romper este gran script para que use menos memoria? ¿Vale la pena poner código poco utilizado en los módulos y solo llamarlos cuando sea necesario?

+4

¿Estás seguro de que usa * demasiada * memoria? – eumiro

+5

¿Ha perfilado su código? – Daenyth

+1

Recuerde que "la optimización prematura es la raíz de todo mal". – Amr

Respuesta

2

Las funciones de desplazamiento no cambiarán el uso de la memoria. Tan pronto como importe ese otro módulo, definirá todas las funciones en el módulo. Pero las funciones no ocupan mucha memoria. ¿Son extremadamente repetitivos, quizás puedas tener menos código refacturando las funciones?

La pregunta de @ eumiro es correcta: ¿estás seguro de que el script usa demasiada memoria? ¿Cuánta memoria usa y por qué es demasiado?

22

organzing:

Su script en Python parece de hecho ser enorme, tal vez debería considerar la reorganización de su código en primer lugar, para dividir en en varias modules or packages . Probablemente hará más fácil el perfil del código y las tareas de optimización.

Es posible que desee echar un vistazo aquí:

Y posiblemente:

Optimización:

Hay muchas cosas que se pueden hacer para optimizar su código ...

Por ejemplo, con respecto a sus estructuras de datos ... Si hace un gran uso de listas o enumera comprensiones, podría tratar de averiguar dónde realmente necesita listas, y dónde podrían ser reemplazadas por estructuras de datos no mutables ures como tuplas o por objetos "volátiles", contenedores "perezosos", como expresiones de generador.

Ver:

En estas páginas, se puede encontrar alguna información útil y sugerencias:

Además, se debe estudiar sus formas de hacer las cosas y se preguntan si hay una manera de hacerlo menos avidez, de una manera que es mejor hazlo en Python (encontrarás algunos consejos en la etiqueta pythonic) ... Eso es especialmente cierto en Python, ya que en Python, a menudo hay una forma "obvia" de (y solo uno) de hacer cosas que es mejor que el otro s (ver The Zen of Python), que se dice que es pythonic. No está especialmente relacionado con la forma de tu código, sino también, y sobre todo, con las actuaciones. A diferencia de muchos idiomas, que promueven la idea de que debe haber muchas formas de hacer cualquier cosa, Python prefiere enfocarse solo de la mejor manera. Entonces, obviamente, hay muchas maneras de hacer algo, pero a menudo, uno es realmente mejor.

Ahora, también debe verificar si está utilizando los mejores métodos para hacer las cosas, porque pythonicality no organizará sus algoritmos por usted.

Pero, por fin, depende mucho de su código, es difícil responder sin haberlo visto.

Y, asegúrese de tener en cuenta los comentarios realizados por eumiro y Amr.

+0

¿Conoces alguna forma de determinar la cantidad de memoria que requiere un fragmento de código Python? Es fácil usar 'timeit' para las comparaciones de velocidad, entonces estoy buscando algo que me permita determinar/caracterizar el consumo de memoria. Solo curiosidad si hay algo tan simple. – Levon

+2

[memory_profiler] (http://pypi.python.org/pypi/memory_profiler) es bastante útil, fácil de usar para la depuración rápida. Ahora puedes probar [meliae] (https://code.launchpad.net/meliae) ([paso a paso cómo hacerlo] (http://jam-bazaar.blogspot.ie/2010/08/step- by-step-meliae.html)) o [heapy] (http://guppy-pe.sourceforge.net/#Heapy) para obtener soluciones más completas. Buena discusión [aquí] (http://stackoverflow.com/questions/110259/python-memory-profiler) y algunos métodos de estimación interesantes [aquí] (http://stackoverflow.com/questions/563840/how-can-i -check-the-memory-usage-of-objects-in-ipython) – cedbeu

+0

Creo que estás más buscando algo así como el módulo [memory_profiler] (http://pypi.python.org/pypi/memory_profiler) que mencioné, aunque. – cedbeu

3

El asesoramiento sobre expresiones de generadores y el uso de módulos es bueno. La optimización prematura causa problemas, pero siempre debe pasar unos minutos pensando en su diseño antes de sentarse a escribir el código. Particularmente si ese código está destinado a ser reutilizado.

Por cierto, mencionas que tienes muchas estructuras de datos definidas en la parte superior de tu script, lo que implica que todas están cargadas en la memoria al inicio. Si se trata de un conjunto de datos muy grande, considere mover conjuntos de datos específicos a archivos separados y cargarlos solo según sea necesario. (usando el módulo csv, o numpy.loadtxt(), etc.)

Aparte de usar menos memoria, también busque formas de usar la memoria de manera más eficiente. Por ejemplo, para grandes conjuntos de datos numéricos, las matrices numpy son una forma de almacenar información que proporcionará un mejor rendimiento en sus cálculos. Hay algunos consejos ligeramente anticuados en http://wiki.python.org/moin/PythonSpeed/PerformanceTips

Cuestiones relacionadas