Whatsapp Telegram Telegram Call Anrufen

Performance-Optimierung, cProfile und timeit und Cython und NumPy in Python


Die Optimierung der Performance ist ein wichtiger Aspekt bei der Entwicklung effizienter Anwendungen. Dieser Artikel behandelt Techniken zur Performance-Optimierung in Python, einschließlich Profiling und Benchmarking, Speicherverwaltung und der Verwendung von Cython und NumPy zur Leistungssteigerung.

1. Profiling und Benchmarking

Profiling und Benchmarking sind Techniken, um die Performance eines Programms zu messen und Engpässe zu identifizieren. Profiling liefert detaillierte Informationen über die Laufzeit und Ressourcennutzung von Funktionen, während Benchmarking spezifische Codeabschnitte testet.

Profiling mit cProfile:

cProfile ist ein in Python integriertes Modul zur Profilerstellung.

Beispiel:

import cProfile

def langsame_funktion():
    total = 0
    for i in range(1, 10000):
        total += i
    return total

def schnelle_funktion():
    return sum(range(1, 10000))

cProfile.run('langsame_funktion()')
cProfile.run('schnelle_funktion()')

Ausgabe:

         5 function calls in 0.001 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001    0.001    0.001 <ipython-input-1>:3(langsame_funktion)
        1    0.000    0.000    0.000    0.000 <ipython-input-1>:8(schnelle_funktion)
        1    0.000    0.000    0.001    0.001 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}


Erklärung:

  • cProfile.run('funktion()'): Führt die angegebene Funktion aus und erstellt ein Profil ihrer Ausführung.
  • ncalls: Anzahl der Aufrufe.
  • tottime: Gesamtzeit, die in der Funktion verbracht wurde.
  • percall: Durchschnittliche Zeit pro Aufruf.
  • cumtime: Kumulative Zeit einschließlich aller Unteraufrufe.

Benchmarking mit timeit:

timeit ist ein Modul zur Messung der Ausführungszeit von kleinen Code-Snippets.

Beispiel:

import timeit

setup = "from __main__ import langsame_funktion, schnelle_funktion"
langsamer_test = timeit.timeit("langsame_funktion()", setup=setup, number=1000)
schneller_test = timeit.timeit("schnelle_funktion()", setup=setup, number=1000)

print(f"Langsame Funktion: {langsamer_test} Sekunden")
print(f"Schnelle Funktion: {schneller_test} Sekunden")

Ausgabe:

Langsame Funktion: 0.021345678 Sekunden
Schnelle Funktion: 0.002123456 Sekunden

Erklärung:

  • timeit.timeit("funktion()", setup=setup, number=1000): Misst die Ausführungszeit der angegebenen Funktion für 1000 Durchläufe.

2. Speicherverwaltung

Effiziente Speicherverwaltung ist entscheidend für die Performance. Python bietet Werkzeuge zur Überwachung und Optimierung der Speichernutzung.

Speicherüberwachung mit tracemalloc:

tracemalloc ist ein Modul zur Überwachung der Speicherzuweisung in Python.

Beispiel:

import tracemalloc

def erzeugen_liste():
    return [i for i in range(10000)]

tracemalloc.start()
erzeugen_liste()
snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

for stat in top_stats[:10]:
    print(stat)

Ausgabe:

/tmp/ipykernel_12345/123456789.py:4: size=78.1 KiB, count=10001, average=8 B


Erklärung:

  • tracemalloc.start(): Startet die Überwachung der Speicherzuweisungen.
  • tracemalloc.take_snapshot(): Erstellt einen Schnappschuss der aktuellen Speicherzuweisungen.
  • statistics('lineno'): Gibt die Speicherstatistiken nach Zeilennummer zurück.

Speicheroptimierung:

Python bietet verschiedene Techniken zur Speicheroptimierung, z.B. durch die Verwendung von Generatoren anstelle von Listen, um Speicherplatz zu sparen.

Beispiel:

def erzeugen_generator():
    for i in range(10000):
        yield i

gen = erzeugen_generator()
print(next(gen))
print(next(gen))

Ausgabe:

0
1


Erklärung:

  • Generatoren: Generatoren verwenden das yield-Schlüsselwort, um Speicherplatz zu sparen, indem sie Werte bei Bedarf erzeugen.

3. Verwendung von Cython und NumPy zur Leistungssteigerung

Cython ist eine Erweiterung für Python, die die Leistung durch die Übersetzung von Python-Code in C verbessert.

Beispiel mit Cython:

a. Erstellen Sie eine .pyx-Datei:


def schnelle_funktion(int n):
    cdef int i
    cdef double total = 0
    for i in range(n):
        total += i
    return total


b. Kompilieren Sie die Datei:

cythonize -i schnelle_funktion.pyx

d. Verwenden Sie die kompilierte Funktion in Python:

import schnelle_funktion
print(schnelle_funktion.schnelle_funktion(1000000))

Ausgabe:

499999500000.0

Erklärung:

  • Cython: Verbessert die Performance durch die Kompilierung von Python-Code in C.

NumPy bietet effiziente numerische Operationen und ist besonders nützlich für mathematische Berechnungen.

Beispiel mit NumPy:

import numpy as np

array = np.arange(1000000)
print(np.sum(array))

Ausgabe:

499999500000

Erklärung:

  • NumPy: Bietet effiziente numerische Operationen auf Arrays und Matrizen.

Zusammenfassung

Performance-Optimierung in Python umfasst verschiedene Techniken, einschließlich Profiling und Benchmarking, effizienter Speicherverwaltung und der Verwendung von leistungsstarken Bibliotheken wie Cython und NumPy. Durch das Verständnis und die Anwendung dieser Techniken können Sie die Effizienz und Leistung Ihrer Python-Anwendungen erheblich verbessern.






CEO Image

Ali Ajjoub

info@ajjoub.com

Adresse 0049-15773651670

Adresse Jacob-winter-platz,1 01239 Dresden

Buchen Sie jetzt Ihren Termin für eine umfassende und individuelle Beratung.

Termin Buchen

Kontaktieren Sie uns

Lassen Sie uns K o n t a k t aufnehmen!