Als Python-Entwickler konzentrieren wir uns oft darauf, unseren Code zum Laufen zu bringen, bevor wir uns um die Optimierung kümmern. Wenn es jedoch um umfangreiche Anwendungen oder leistungskritischen Code geht, ist die Optimierung von entscheidender Bedeutung. In diesem Beitrag stellen wir zwei leistungsstarke Tools vor, mit denen Sie Ihren Python-Code optimieren können: das cProfile-Modul und den PyPy-Interpreter.
Am Ende dieses Beitrags erfahren Sie:
Python ist bekannt für seine Benutzerfreundlichkeit, Lesbarkeit und sein umfangreiches Ökosystem an Bibliotheken. Allerdings ist es aufgrund seiner interpretierten Natur auch langsamer als einige andere Sprachen wie C oder Java. Daher kann es bei leistungsempfindlichen Anwendungen wie maschinellen Lernmodellen, Echtzeitsystemen oder Hochfrequenzhandelssystemen von entscheidender Bedeutung sein, zu wissen, wie Sie Ihren Python-Code optimieren.
Die Optimierung folgt normalerweise diesen Schritten:
Jetzt beginnen wir mit der Profilierung Ihres Codes.
cProfile ist ein integriertes Python-Modul für die Leistungsprofilerstellung. Es verfolgt, wie viel Zeit jede Funktion in Ihrem Code zur Ausführung benötigt, was Ihnen dabei helfen kann, die Funktionen oder Codeabschnitte zu identifizieren, die zu Verlangsamungen führen.
Der einfachste Weg, ein Skript zu profilieren, besteht darin, cProfile über die Befehlszeile auszuführen. Nehmen wir zum Beispiel an, Sie haben ein Skript namens my_script.py:
python -m cProfile -s cumulative my_script.py
Erklärung:
Dadurch wird eine detaillierte Aufschlüsselung darüber erstellt, wo Ihr Code seine Zeit verbringt.
Sehen wir uns ein einfaches Python-Skript an, das Fibonacci-Zahlen rekursiv berechnet:
def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": print(fibonacci(30))
Dieses Skript mit cProfile ausführen:
python -m cProfile -s cumulative fibonacci_script.py
Sobald Sie cProfile ausführen, sehen Sie etwa Folgendes:
ncalls tottime percall cumtime percall filename:lineno(function) 8320 0.050 0.000 0.124 0.000 fibonacci_script.py:3(fibonacci)
Jede Spalte enthält wichtige Leistungsdaten:
Wenn Ihre Fibonacci-Funktion zu viel Zeit in Anspruch nimmt, zeigt Ihnen diese Ausgabe, worauf Sie Ihre Optimierungsbemühungen konzentrieren sollten.
Sie können cProfile auch programmgesteuert in Ihrem Code verwenden, wenn Sie nur bestimmte Abschnitte profilieren möchten.
import cProfile def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": cProfile.run('fibonacci(30)')
Sobald Sie mit cProfile die Engpässe in Ihrem Code identifiziert haben, ist es Zeit für die Optimierung.
Beispiel:
# Before: Custom sum loop total = 0 for i in range(1000000): total += i # After: Using built-in sum total = sum(range(1000000))
Beispiel:
# Before: Unnecessary repeated calculations for i in range(1000): print(len(my_list)) # len() is called 1000 times # After: Compute once and reuse list_len = len(my_list) for i in range(1000): print(list_len)
Beispiel:
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2)
Dies beschleunigt die Fibonacci-Berechnung erheblich, indem die Ergebnisse jedes rekursiven Aufrufs gespeichert werden.
PyPy ist ein alternativer Python-Interpreter, der die Just-in-Time-Kompilierung (JIT) verwendet, um Ihren Python-Code zu beschleunigen. PyPy kompiliert häufig ausgeführte Codepfade in Maschinencode und ist damit für bestimmte Aufgaben viel schneller als der Standard-CPython-Interpreter.
You can install PyPy using a package manager like apt on Linux or brew on macOS:
# On Ubuntu sudo apt-get install pypy3 # On macOS (using Homebrew) brew install pypy3
Once PyPy is installed, you can run your script with it instead of CPython:
pypy3 my_script.py
Now, let’s combine these tools to fully optimize your Python code.
Let’s revisit our Fibonacci example and put everything together.
from functools import lru_cache @lru_cache(maxsize=None) def fibonacci(n): if n <= 1: return n return fibonacci(n-1) + fibonacci(n-2) if __name__ == "__main__": import cProfile cProfile.run('print(fibonacci(30))')
After optimizing the code with memoization, run it using PyPy for further performance improvements:
pypy3 fibonacci_script.py
By leveraging cProfile and PyPy, you can greatly optimize your Python code. Use cProfile to identify and address performance bottlenecks in your code. Then, use PyPy to further boost your program’s execution speed through JIT compilation.
In summary:
With this approach, you can make your Python programs run faster and more efficiently, especially for CPU-bound tasks.
Connect with me:
Github
Linkedin
Das obige ist der detaillierte Inhalt vonOptimieren von Python-Code mit cProfile und dem PyPy-Modul: Eine vollständige Anleitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!