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.48
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!