psutil python optimization module package organization

psutil - Cómo reducir el uso de memoria Python Script



install psutil python 3 (4)

Tengo una secuencia de comandos de Python muy grande, 200K, que me gustaría usar la menor cantidad de memoria posible Parece algo así como:

# 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 utilizo en un módulo, y las importe dinámicamente solo si es necesario, no puedo acceder a los datos. Eso es lo que he conseguido.

Soy nuevo en Python.

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


El consejo sobre expresiones generadoras y 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 código. Particularmente si ese código está destinado a ser reutilizado.

Por cierto, mencionas que tienes una gran cantidad de estructuras de datos definidas en la parte superior de tu script, lo que implica que todas se cargan en la memoria al principio. Si se trata de un conjunto de datos muy grande, considere mover conjuntos de datos específicos a archivos separados y cargarlos solo cuando 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 de números son una forma de almacenar información que proporcionará un mejor rendimiento en sus cálculos. Hay algunos consejos un poco anticuados en http://wiki.python.org/moin/PythonSpeed/PerformanceTips



Mover funciones alrededor no cambiará 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 refactorizando las funciones?

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


Organizando:

Su script de Python parece ser enorme, tal vez debería considerar reorganizar su código primero, para dividirlo en varios módulos o paquetes . Probablemente facilitará el perfilado del código y las tareas de optimización.

Es posible que desee echar un vistazo allí:

Y posiblemente:

Optimizando

Se pueden hacer muchas cosas para optimizar su código ...

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

Ver:

En estas páginas, puede encontrar información y consejos útiles:

Además, debes estudiar tus formas de hacer las cosas y preguntarte si hay una manera de hacerlo con menos avidez, una forma de hacerlo en Python (encontrarás algunos consejos en la etiqueta pythonic ) ... Eso es especialmente cierto en Python, ya que en Python, a menudo hay una manera "obvia" (y solo una) de hacer las cosas que es mejor que las otras (ver El zen de Python ), que se dice que es pitónica . No está especialmente relacionado con la forma de su código, sino también, y sobre todo, con las actuaciones. A diferencia de muchos idiomas, que promueven la idea de que debería haber muchas formas de hacer cualquier cosa, Python prefiere centrarse en la mejor manera solamente. Obviamente, hay muchas maneras de hacer algo, pero a menudo, una es realmente mejor.

Ahora, también debe verificar si está utilizando los mejores métodos para hacer las cosas, ya que la pitonicalidad no ordenará sus algoritmos por usted.

Pero al final, depende mucho de tu código, es difícil responder sin haberlo visto.

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