Heim >Backend-Entwicklung >Python-Tutorial >Überwachen Sie die Python-Speichernutzung und die Codeausführungszeit

Überwachen Sie die Python-Speichernutzung und die Codeausführungszeit

WBOY
WBOYnach vorne
2023-04-10 14:56:351579Durchsuche

Welche Teile meines Codes benötigen zur Ausführung am längsten und verbrauchen den meisten Speicher? Wie kann ich Verbesserungsmöglichkeiten finden?

Ich bin mir ziemlich sicher, dass die meisten von uns das während der Entwicklung gerne wissen würden. In diesem Artikel habe ich einige Möglichkeiten zusammengefasst, die Zeit- und Speichernutzung von Python-Code zu überwachen.

Überwachen Sie die Python-Speichernutzung und die Codeausführungszeit

In diesem Artikel werden vier Methoden vorgestellt. Die ersten drei Methoden liefern Zeitinformationen und die vierte Methode kann die Speichernutzung ermitteln.

  • Zeitmodul
  • %%Zeit-Zauberbefehl
  • line_profiler
  • memory_profiler

Zeitmodul

Dies ist die einfachste und direkteste (erfordert jedoch manuelle Entwicklung) Methode zur Berechnung, wie lange es dauert, bis Ihr Code ausgeführt wird . Seine Logik ist ebenfalls sehr einfach: Zeichnen Sie die Zeit vor und nach der Ausführung des Codes auf und berechnen Sie die Differenz zwischen den Zeiten. Dies kann wie folgt erreicht werden:

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

Das folgende Beispiel zeigt den Zeitunterschied zwischen einer for-Schleife und einem Listenverständnis:

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))

Wir alle wissen, dass for langsamer ist.

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

%%time Magic Command

Magic Command ist ein praktischer Befehl, der in den IPython-Kernel integriert ist und problemlos bestimmte Aufgaben ausführen kann. Im Allgemeinen wird es in Jupyter-Notebooks verwendet.

Fügen Sie %%time am Anfang der Zelle hinzu. Nachdem die Zellenausführung abgeschlossen ist, wird die für die Zellenausführung aufgewendete Zeit ausgegeben.

%%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)

Die Ergebnisse sind wie folgt:

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

Die CPU-Zeiten hier sind die tatsächliche Zeit, die die CPU für die Verarbeitung des Codes benötigt, und die Wall-Zeit ist die tatsächliche Zeit, in der das Ereignis vergeht, die Zeit zwischen Methodeneingabe und Methodenausgang.

line_profiler

Die ersten beiden Methoden liefern nur die Gesamtzeit, die zum Ausführen der Methode erforderlich ist. Durch den Zeitanalysator können wir die Laufzeit jedes Codes in der Funktion ermitteln.

Hier müssen wir das Paket line_profiler verwenden. Verwenden Sie 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')

Die Ausgabe lautet wie folgt:

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

Sie können sehen, dass line_profiler detaillierte Informationen über die für jede Codezeile aufgewendete Zeit bereitstellt.

  • Zeileninhalt: laufender Code
  • Hits: die Häufigkeit, mit der die Zeile ausgeführt wurde
  • Zeit: die Gesamtzeit, die aufgewendet wurde (d. h. die Anzahl der Treffer x die Anzahl der Treffer pro Treffer)
  • Per Hit: die Zeit, in der sie ausgeführt wurde dauert für eine Ausführung, also sagen wir Zeit = Treffer
  • memory_profiler
Ähnlich wie line_profiler bietet Memory_profiler eine zeilenweise Speichernutzung Ihres Codes.

Um es zu installieren, müssen Sie pip install memory_profiler verwenden. Hier überwachen wir die Speichernutzung der Funktion „convert_cms_f“. Die Funktion

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 wird in einer separaten Datei definiert und dann importiert. Hier sind die Ergebnisse:

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 bietet detaillierte Einblicke in die Speichernutzung jeder Codezeile.

1 MiB (MebiByte) entspricht hier fast 1 MB. 1 MiB = 1,048576 1 MB

Memory_profiler hat aber auch einige Nachteile: Es fragt den Betriebssystemspeicher ab, sodass die Ergebnisse möglicherweise geringfügig vom Python-Interpreter abweichen. Wenn Sie %mprun mehrmals in einer Sitzung ausführen, stellen Sie möglicherweise fest, dass das Delta Spalte meldet alle Codezeile 0,0 MiB. Dies liegt an den Einschränkungen magischer Befehle.

Obwohl es mit dem Memory_Profiler einige Probleme gibt, ermöglicht er uns ein klares Verständnis der Speichernutzung und ist ein sehr nützliches Werkzeug für die Entwicklung.

Zusammenfassung

Obwohl Python keine Sprache ist, die für ihre Ausführungseffizienz bekannt ist, sind diese Befehle für uns in einigen Sonderfällen dennoch sehr hilfreich.

Das obige ist der detaillierte Inhalt vonÜberwachen Sie die Python-Speichernutzung und die Codeausführungszeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen