Heim >Backend-Entwicklung >Python-Tutorial >Überwachen Sie die Python-Speichernutzung und die Codeausführungszeit
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.
In diesem Artikel werden vier Methoden vorgestellt. Die ersten drei Methoden liefern Zeitinformationen und die vierte Methode kann die Speichernutzung ermitteln.
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 %
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.
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.
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 bietet detaillierte Einblicke in die Speichernutzung jeder Codezeile. 1 MiB (MebiByte) entspricht hier fast 1 MB. 1 MiB = 1,048576 1 MBMemory_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. ZusammenfassungObwohl 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!