Memory Profiler

Introducció

En el desenvolupament de programari, conèixer el rendiment dels nostres scripts és crucial per a optimitzar-los i garantir un funcionament eficient. Memory Profiler és una biblioteca de Python que ens permet obtenir informació detallada sobre el consum de memòria dels nostres programes, identificant possibles fuites de memòria i colls d’ampolla.

Recalcar que un bon coneixement del consum dels nostres scripts ens permet tenir un major control i optimització dels recursos de Multivac.

Instal·lació

Hem d’afegir al nostre virtual environment el paquet memory_profiler. Això ho farem executant pip install memory_profiler.

Ho podem fer de dues formes quer veurem a continuació

Codi d’exemple Alternativa 1

Només hem d’afegir la comanda import memory_profiler as mp i afegir les línies que ens permeten calcular el consum de memòria:

import memory_profiler as mp
def quadrat(n):
   '''
   Funció que calcula el quadrat d'un nombre.

   Args:
      n: El nombre del qual es vol calcular el quadrat.

   Returns:
      El quadrat de n.
   '''
   return n * n

def main():
   '''
   Funció principal que executa l'algorisme i mostra el seu perfil de memòria.
   '''
   # Executa la funció quadrat amb diferents valors d'entrada
   for i in range(3):
      mp.profile(quadrat)(i)


if __name__ == "__main__":
   main()

El resultat en aquest cas serà similar a aquest:

Filename: /home/users/alexandre.gracia/tests/memory_profiler/test.py

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
   3     21.5 MiB     21.5 MiB           1   def quadrat(n):
   4                                                 '''
   5                                                 Funció que calcula el quadrat d'un nombre.
   6
   7                                                 Args:
   8                                                         n: El nombre del qual es vol calcular el quadrat.
   9
   10                                                Returns:
   11                                                        El quadrat de n.
   12                                                '''
   13    21.5 MiB      0.0 MiB           1           return n * n


Filename: /home/users/alexandre.gracia/tests/memory_profiler/test.py

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
   3     21.5 MiB     21.5 MiB           1   def quadrat(n):
   4                                                 '''
   5                                                 Funció que calcula el quadrat d'un nombre.
   6
   7                                                 Args:
   8                                                         n: El nombre del qual es vol calcular el quadrat.
   9
   10                                                Returns:
   11                                                        El quadrat de n.
   12                                                '''
   13    21.5 MiB      0.0 MiB           1           return n * n


Filename: /home/users/alexandre.gracia/tests/memory_profiler/test.py

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
   3     21.5 MiB     21.5 MiB           1   def quadrat(n):
   4                                                 '''
   5                                                 Funció que calcula el quadrat d'un nombre.
   6
   7                                                 Args:
   8                                                         n: El nombre del qual es vol calcular el quadrat.
   9
   10                                                Returns:
   11                                                        El quadrat de n.
   12                                                '''
   13    21.5 MiB      0.0 MiB           1           return n * n

Codi d’exemple Alternativa 2

En aquesta alternativa tindrem un informe total de tota la funció main, usant la directiva @mp.profile

import memory_profiler as mp

def quadrat(n):
   return n * n

@mp.profile
def main():

   for i in range(3):
      quadrat(i)

if __name__ == "__main__":
   main()

El resultat en aquest cas serà similar a aquest:

Filename: /home/users/alexandre.gracia/tests/memory_profiler/test.py

Line #    Mem usage    Increment  Occurrences   Line Contents
=============================================================
   6     21.4 MiB     21.4 MiB           1   @mp.profile
   7                                         def main():
   8
   9     21.4 MiB      0.0 MiB           4           for i in range(3):
   10    21.4 MiB      0.0 MiB           3                   quadrat(i)