Logotipo de Zephyrnet

Introducción a la creación de perfiles de memoria en Python – KDnuggets

Fecha:

Introducción a la creación de perfiles de memoria en Python
Imagen del autor
 

Crear perfiles de código Python es útil para comprender cómo funciona el código e identificar oportunidades de optimización. Probablemente haya perfilado sus scripts de Python para métricas relacionadas con el tiempo—medir los tiempos de ejecución de secciones específicas de código. 

Pero la creación de perfiles de memoria (para comprender la asignación y desasignación de memoria durante la ejecución) es igualmente importante. Porque la creación de perfiles de memoria puede ayudar a identificar pérdidas de memoria, utilización de recursos y posibles problemas de escalado. 

En este tutorial, exploraremos la creación de perfiles de código Python para el uso de memoria utilizando el paquete Python. perfilador de memoria.

Comencemos instalando el paquete Python del perfilador de memoria usando pip:

pip3 install memory-profiler

 

Note: Instale el perfilador de memoria en un lugar dedicado ambiente virtual para el proyecto en lugar de en su entorno global. También usaremos las capacidades de trazado disponibles en el perfilador de memoria para trazar el uso de la memoria, lo que requiere matplotlib. Así que asegúrese de tener también matplotlib instalado en el entorno virtual del proyecto.

Creemos un script de Python (digamos main.py) con una función process_strs:

  • La función crea dos cadenas de Python súper largas. str1 y str2 y los concatena. 
  • El argumento de la palabra clave reps controla el número de veces que las cadenas codificadas deben repetirse para crear str1 y str2. Y le damos un valor predeterminado de 10**6 que se usará si la función llamada no especifica el valor de reps.
  • Luego eliminamos explícitamente str2
  • La función devuelve la cadena concatenada. str3.
# main.py

from memory_profiler import profile

@profile
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

Ejecutar el script debería darte un resultado similar: 

 

Introducción a la creación de perfiles de memoria en Python
 

Como se ve en el resultado, podemos ver la memoria utilizada, el incremento con cada creación de cadena posterior y el paso de eliminación de cadena que libera parte de la memoria utilizada.

Ejecutando el comando mprof 

En lugar de ejecutar el script Python como se muestra arriba, también puede ejecutar el mprof comando como tal:

mprof run --python main.py

 

Cuando ejecuta este comando, también debería poder ver un archivo .dat con los datos de uso de la memoria. Tendrás un archivo .dat cada vez que ejecutes el mprof comando: identificado por la marca de tiempo.

 

Introducción a la creación de perfiles de memoria en Python

Trazar el uso de la memoria 

A veces es más fácil analizar el uso de la memoria a partir de un gráfico en lugar de mirar números. Recuerde que discutimos que matplotlib es una dependencia requerida para usar las capacidades de trazado. 

Puede utilizar el mprof plot comando para trazar los datos en el archivo .dat y guardarlos en un archivo de imagen (aquí salida.png):

mprof plot -o output.png

 

De forma predeterminada, mprof plot utilizó los datos de la ejecución más reciente del mprof mando.

 

Introducción a la creación de perfiles de memoria en Python
 

También puede ver las marcas de tiempo mencionadas en la trama.

Registro del perfil de uso de memoria en un archivo de registro

Alternativamente, puede registrar las estadísticas de uso de memoria en un archivo de registro preferido en el directorio de trabajo. Aquí, creamos un controlador de archivos. mem_logs al archivo de registro y configure el stream argumento en el @profile decorador del controlador de archivos:

# main.py

from memory_profiler import profile

mem_logs = open('mem_profile.log','a')

@profile(stream=mem_logs)
def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

 

Cuando ejecute el script, debería poder ver el archivo mem_profile.log en su directorio de trabajo con el siguiente contenido:

 

Introducción a la creación de perfiles de memoria en Python

También puedes utilizar la memory_usage() función para comprender los recursos necesarios para que se ejecute una función específica, muestreados en intervalos de tiempo regulares.

El memory_usage La función toma la función para perfilar, argumentos posicionales y de palabras clave como una tupla.

Aquí, nos gustaría encontrar el uso de memoria del process_strs función con el argumento de palabra clave reps establecido en 10**7. También establecemos el intervalo de muestreo en 0.1 s:

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.1)
print(mem_used)

 

Aquí está el resultado correspondiente:

Output >>>
[21.21875, 21.71875, 147.34375, 277.84375, 173.93359375]

 

También puede ajustar el intervalo de muestreo según la frecuencia con la que desea que se capture el uso de la memoria. Como ejemplo, establecemos el intervalo en 0.01 s; lo que significa que ahora obtendremos una vista más granular de la memoria utilizada.

# main.py

from memory_profiler import memory_usage

def process_strs(reps=10**6):
	str1 = 'python'*reps
	str2 = 'programmer'*reps
	str3 = str1 + str2
	del str2
	return str3

process_strs(reps=10**7)

mem_used = memory_usage((process_strs,(),{'reps':10**7}),interval=0.01)
print(mem_used)

 

Debería poder ver un resultado similar:

Output >>>
[21.40234375, 21.90234375, 33.90234375, 46.40234375, 59.77734375, 72.90234375, 85.65234375, 98.40234375, 112.65234375, 127.02734375, 141.27734375, 155.65234375, 169.77734375, 184.02734375, 198.27734375, 212.52734375, 226.65234375, 240.40234375, 253.77734375, 266.52734375, 279.90234375, 293.65234375, 307.40234375, 321.27734375, 227.71875, 174.1171875]

En este tutorial, aprendimos cómo comenzar a crear perfiles de scripts de Python para el uso de memoria.

Específicamente, aprendimos cómo hacer esto usando el paquete Memory-profiler. Usamos el @profile decorador y el memory_usage() función para obtener el uso de memoria de un script de Python de muestra. También aprendimos cómo utilizar capacidades como trazar el uso de la memoria y capturar las estadísticas en un archivo de registro.

Si está interesado en perfilar su script Python para los tiempos de ejecución, considere leer Creación de perfiles de código Python utilizando timeit y cProfile.
 
 

Bala Priya C. es un desarrollador y escritor técnico de la India. Le gusta trabajar en la intersección de matemáticas, programación, ciencia de datos y creación de contenido. Sus áreas de interés y experiencia incluyen DevOps, ciencia de datos y procesamiento de lenguaje natural. ¡Le gusta leer, escribir, codificar y tomar café! Actualmente, está trabajando para aprender y compartir su conocimiento con la comunidad de desarrolladores mediante la creación de tutoriales, guías prácticas, artículos de opinión y más.

punto_img

Información más reciente

punto_img