Maison  >  Article  >  développement back-end  >  Surveiller l'utilisation de la mémoire Python et le temps d'exécution du code

Surveiller l'utilisation de la mémoire Python et le temps d'exécution du code

WBOY
WBOYavant
2023-04-10 14:56:351504parcourir

Quelles parties de mon code prennent le plus de temps à s'exécuter et utilisent le plus de mémoire ? Comment puis-je trouver des axes d’amélioration ?

Je suis presque sûr que la plupart d'entre nous aimeraient savoir cela pendant le développement, dans cet article, j'ai résumé quelques façons de surveiller l'utilisation du temps et de la mémoire du code Python.

Surveiller l'utilisation de la mémoire Python et le temps d'exécution du code

Cet article présentera 4 méthodes. Les 3 premières méthodes fournissent des informations temporelles et la quatrième méthode peut obtenir l'utilisation de la mémoire.

  • time module
  • %%time magic command
  • line_profiler
  • memory_profiler

time module

C'est la méthode la plus simple et la plus directe (mais nécessite un développement manuel) pour calculer le temps nécessaire à l'exécution de votre code . Sa logique est également très simple : enregistrer le temps avant et après l'exécution du code, et calculer la différence entre les temps. Cela peut être réalisé comme suit :

import time
 
 start_time = time.time()
 result = 5+2
 end_time = time.time()
 
 print('Time taken = {} sec'.format(end_time - start_time))

L'exemple suivant montre la différence de temps entre une boucle for et une compréhension de liste :

import time
 
 # for loop vs. list comp
 list_comp_start_time = time.time()
 result = [i for i in range(0,1000000)]
 list_comp_end_time = time.time()
 print('Time taken for list comp = {} sec'.format(list_comp_end_time - list_comp_start_time))
 
 result=[]
 for_loop_start_time = time.time()
 for i in range(0,1000000):
 result.append(i)
 for_loop_end_time = time.time()
 print('Time taken for for-loop = {} sec'.format(for_loop_end_time - for_loop_start_time))
 
 list_comp_time = list_comp_end_time - list_comp_start_time
 for_loop_time = for_loop_end_time - for_loop_start_time
 print('Difference = {} %'.format((for_loop_time - list_comp_time)/list_comp_time * 100))

Nous savons tous que for est plus lent.

Time taken for list comp = 0.05843973159790039 sec
 Time taken for for-loop = 0.06774497032165527 sec
 Difference = 15.922795107582594 %

%%time magic command

Magic command est une commande pratique intégrée au noyau IPython qui peut facilement effectuer des tâches spécifiques. Généralement, il est utilisé dans le notebook Jupyter.

Ajoutez %%time au début de la cellule. Une fois l'exécution de la cellule terminée, le temps passé à l'exécution de la cellule sera affiché.

%%time
 def convert_cms(cm, unit='m'):
 '''
Function to convert cm to m or feet
'''
 if unit == 'm':
 return cm/100
 return cm/30.48
 
 convert_cms(1000)

Les résultats sont les suivants :

CPU times: user 24 µs, sys: 1 µs, total: 25 µs
 Wall time: 28.1 µs
 
 Out[8]: 10.0

Les temps CPU ici sont le temps réel passé par le CPU à traiter le code, et le temps Wall est le temps réel pendant lequel l'événement s'écoule, le temps entre l'entrée de la méthode et la méthode. sortie.

line_profiler

Les deux premières méthodes fournissent uniquement le temps total nécessaire à l'exécution de la méthode. Grâce à l'analyseur de temps, nous pouvons obtenir le temps d'exécution de chaque code dans la fonction.

Ici, nous devons utiliser le package line_profiler. Utilisez pip install line_profiler.

import line_profiler
 
 def convert_cms(cm, unit='m'):
 '''
Function to convert cm to m or feet
'''
 if unit == 'm':
 return cm/100
 return cm/30.48
 
 # Load the profiler
 %load_ext line_profiler
 
 # Use the profiler's magic to call the method
 %lprun -f convert_cms convert_cms(1000, 'f')

Le résultat est le suivant :

Timer unit: 1e-06 s
 
 Total time: 4e-06 s
 File: /var/folders/y_/ff7_m0c146ddrr_mctd4vpkh0000gn/T/ipykernel_22452/382784489.py
 Function: convert_cms at line 1
 
 Line # Hits Time Per Hit % Time Line Contents
 ==============================================================
1 def convert_cms(cm, unit='m'):
2 '''
3 Function to convert cm to m or feet
4 '''
5 1 2.0 2.0 50.0 if unit == 'm':
6 return cm/100
7 1 2.0 2.0 50.0 return cm/30.48

Vous pouvez voir que line_profiler fournit des informations détaillées sur le temps passé sur chaque ligne de code.

  • Contenu de la ligne : code en cours d'exécution
  • Hits : le nombre de fois où la ligne a été exécutée
  • Time : le temps total passé (c'est-à-dire le nombre de hits x le nombre de hits par hit)
  • Per Hit : le temps passé prend pour une exécution, c'est-à-dire Say Time = Hits
  • memory_profiler
Semblable à line_profiler, memory_profiler fournit une utilisation de la mémoire ligne par ligne de votre code.

Pour l'installer, vous devez utiliser pip install memory_profiler. Ici, nous surveillons l'utilisation de la mémoire de la fonction convert_cms_f. La fonction

from conversions import convert_cms_f
 import memory_profiler
 
 %load_ext memory_profiler
 
 %mprun -f convert_cms_f convert_cms_f(1000, 'f')

convert_cms_f est définie dans un fichier séparé puis importée. Voici les résultats :

Line # Mem usage Increment Occurrences Line Contents
 =============================================================
1 63.7 MiB 63.7 MiB 1 def convert_cms_f(cm, unit='m'):
2 '''
3 Function to convert cm to m or feet
4 '''
5 63.7 MiB 0.0 MiB 1 if unit == 'm':
6 return cm/100
7 63.7 MiB 0.0 MiB 1 return cm/30.48

memory_profiler fournit un aperçu détaillé de l'utilisation de la mémoire de chaque ligne de code.

1 MiB (MebiByte) équivaut ici presque à 1 Mo. 1 MiB = 1,048576 1 Mo

Mais memory_profiler présente également certains inconvénients : il interroge la mémoire du système d'exploitation, donc les résultats peuvent être légèrement différents de ceux de l'interpréteur python. Si vous exécutez %mprun plusieurs fois au cours d'une session, vous remarquerez peut-être que le delta. La colonne rapporte toute la ligne de code 0,0 Mio. Cela est dû aux limitations des commandes magiques.

Bien que memory_profiler présente quelques problèmes, il nous permet de comprendre clairement l'utilisation de la mémoire et constitue un outil très utile pour le développement.

Résumé

Bien que Python ne soit pas un langage connu pour son efficacité d'exécution, ces commandes nous sont tout de même très utiles dans certains cas particuliers.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer