Maison >développement back-end >Tutoriel Python >Surveiller l'utilisation de la mémoire Python et le temps d'exécution du code
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.
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.
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 %
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.
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.
from conversions import convert_cms_f import memory_profiler %load_ext memory_profiler %mprun -f convert_cms_f convert_cms_f(1000, 'f')
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.48memory_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 MoMais 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!