Es mag aus heutiger Perspektive seltsam anmuten, aber die Programmiersprache Python wurde einst als reiner Lückenfüller betrachtet beziehungsweise um "das langweilige Zeug zu automatisieren" (so der Titel eines populären Python-Buchs) oder um möglichst schnell App-Prototypen umzusetzen, die später in einer anderen Sprache implementiert werden. Seit diesen bescheidenen Anfängen ist einiges passiert. Python ist seinem Status als "Hilfssprache" längst entwachsen und hat sich fest etabliert in den Bereichen:
moderne Softwareentwicklung,
Infrastrukturmanagement und
Datenanalyse.
Die Programmiersprache gilt als treibende Kraft in Sachen Datenwissenschaft und wenn es darum geht, Webanwendungen zu erstellen. Darüber hinaus ist Python auch ein Treiber in den Bereichen Machine Learning und generativer künstlicher Intelligenz (KI).
Dieser Artikel verschafft Ihnen einen Überblick über die grundlegenden Vor- und auch Nachteile von Python, klärt Sie über die Unterschiede zwischen den verschiedenen Versionen auf und beschäftigt sich auch mit der Frage, ob die Programmiersprache tatsächlich zu wesentlich langsameren Anwendungen führt.
Python-Vorteile
Pythons durchschlagender Erfolg bei unerfahrenen wie erfahrenen Programmierern begründet sich in diversen Benefits.
Python ist einfach zu erlernen und zu nutzen: Die Programmiersprache umfasst eine vergleichsweise bescheidene Anzahl von Funktionen, was den Einstieg erheblich erleichtert. Die Syntax von Python ist leicht lesbar und simpel gehalten - für Einsteiger ist das ideal, um schnell erste Ergebnisse zu erzielen. Generell ermöglichen diese Features Entwicklern, sich auf das Problem zu konzentrieren, das es zu lösen gilt - statt sich über die syntaktische Komplexität oder Legacy-Code Gedanken machen zu müssen.
Python ist weit verbreitet und supported: Wie zum Beispiel die hohe Platzierung im Tiobe Index und die große Zahl von GitHub-Projekten belegen, ist Python sowohl beliebt als auch weit verbreitet. Die Programmiersprache läuft auf allen wichtigen Betriebssystemen und Plattformen - und meist auch auf den Nischenkandidaten. Viele wichtige Bibliotheken und API-gestützte Services nutzen Python-Bindings oder -Wrapper, was eine barrierefreie Kommunikation ermöglicht.
Python ist keine Spielzeugsprache: Auch wenn Skripterstellung und Automatisierung einen großen Teil der Python Use Cases (dazu später mehr) ausmachen, kommt die Sprache auch zum Einsatz, um professionelle Software zu erstellen - sowohl in Form von Standalone-Applikationen als auch Web Services. Python ist dabei vielleicht nicht die schnellste Sprache, macht aber durch Vielseitigkeit wett, was ihr an Geschwindigkeit fehlt. Zudem werden große Anstrengungen unternommen, um Python fortlaufend "Beine" zu machen.
Python entwickelt sich kontinuierlich weiter: Mit jeder Revision erhält Python nützliche neue Funktionen, um mit modernen Softwareentwicklungsmethoden Schritt zu halten. So sind beispielsweise Asynchronous Operations und Coroutines inzwischen Standardkomponenten von Python. Type Hints sind ein weiteres Beispiel: Sie ermöglichen, mit Hilfe von Linting Tools die Programmlogik zu analysieren und tragen so dazu bei Komplexität zu reduzieren. Auch die CPython-Laufzeitumgebung (Standardimplementierung von Python), wird sukzessive weiterentwickelt - unter anderem, um eine schnellere Execution zu ermöglichen.
Python-Anwendungsfälle
Der grundlegende Use Case für Python ist die Verwendung als Skript- und Automatisierungssprache. Dabei dient Python nicht nur als Substitut für Shell-Skripte oder Batch-Dateien, sondern wird auch genutzt, um beispielsweise Interaktionen mit Webbrowsern und Anwendungs-GUIs zu automatisieren - oder um Systeme und Konfigurationen in Tools wie Ansible oder Salt bereitzustellen. Das ist jedoch nur die Spitze des Python-Use-Case-Eisbergs. Python kommt darüber hinaus zur Anwendung für...
Allgemeine Anwendungsprogrammierung: Mit Python lassen sich sowohl Kommandozeilen-basierte als auch plattformübergreifende GUI-Applikationen erstellen und als Self-Contained Executables bereitstellen. Zwar kann Python nativ keine eigenständige Binärdatei aus einem Skript erzeugen, allerdings stehen zu diesem Zweck Packages von Drittanbietern zur Verfügung - beispielsweise PyInstaller oder Nuitka.
Data Science und Machine Learning: Datenanalyse gehört nicht nur zu den IT-Bereichen, die rasant wachsen, sondern ist auch ein Hauptanwendungsfalle von Python. Die meisten Bibliotheken, die im Bereich Datenwissenschaft oder maschinelles Lernen verwendet werden, weisen Python-Schnittstellen auf.
Web Services und RESTful-APIs: Die nativen Python-Bibliotheken und die Web-Frameworks von Drittanbietern ermöglichen es, so gut wie alles zu entwickeln - von simplen REST-APIs bis hin zu komplett datengesteuerten Webseiten.
Metaprogrammierung und Code-Generierung: Python behandelt alles als Objekt, einschließlich der Python-Module und -Bibliotheken. Dadurch eignet sich die Programmiersprache auch als hocheffizienter Code-Generator, der vielseitig erweiterbare Anwendungen ermöglicht, die in diesem Stil mit anderen Sprachen nur schwer (oder gar nicht) realisierbar wären. Python kann auch genutzt werden, um Compiler-Frameworks wie LLVM anzusteuern.
Glue-Code: Python wird oft auch als "Glue Language" bezeichnet, weil die Sprache unterschiedliche Code-Arten (in der Regel Bibliotheken mit C-Schnittstellen) interoperabel macht. Im Bereich Datenwissenschaft und Machine Learning geht die Nutzung von Python in diese Richtung. Anwendungen oder Programmbereiche, die nicht direkt miteinander kommunizieren können, können mit Python verbunden werden.
Was Python nicht kann
Wer A sagt muss auch B sagen - für folgende Tasks ist Python weniger gut geeignet:
Python ist eine High-Level-Programmiersprache und eignet sich folglich nicht, um auf Systemebene zu programmieren - Gerätetreiber oder Betriebssystem-Kernel müssen also außenvorbleiben.
Python ist darüber hinaus nicht ideal, wenn plattformübergreifende, Standalone-Binärdateien benötigt werden. Sie könnten zwar eine Standalone-Python-App für Windows, macOS und Linux coden - das wird aber weder elegant noch einfach.
Nicht einfach wird es darüber hinaus, wenn Sie mit Python native Mobile-Anwendungen erstellen möchten. Das ist mit Sprachen, die entsprechende, native Toolchains für Mobile-Plattformen mitbringen (beispielsweise Swift oder Kotlin), wesentlich einfacher.
Schließlich ist Python auch nicht die beste Wahl, wenn Geschwindigkeit in allen Aspekten der Anwendung absolute Priorität haben soll. In diesem Fall fahren Sie mit C/C++, Rust oder einer anderen Sprache besser. Allerdings können Sie Bibliotheken, die in diesen Sprachen geschrieben sind, dazu nutzen Python in Sachen Geschwindigkeit in Schlagdistanz zu bringen (dazu später mehr).
Wie Python Softwareentwicklung vereinfacht
Die Syntax von Python soll vor allem gut lesbar und möglichst clean sein, ohne viel Schnickschnack. Ein Standard-"Hello World" in Python (3.x) ist nicht viel mehr als:
print("Hello world!")
Python bietet viele syntaktische Elemente, um gängige Programmabläufe prägnant auszudrücken. Das folgende Beispielprogramm liest Zeilen aus einer Textdatei in ein Listenobjekt und entfernt dabei das "Newline"-Merkmal aus jeder Zeile:
with open("myfile.txt") as my_file:
file_lines = [x.rstrip("\n") for x in my_file]
Bei der with/as
-Konstruktion handelt es sich um einen Kontextmanager. Dieser bietet eine effiziente Möglichkeit, ein Objekt für einen Codeblock zu instanziieren und dieses dann außerhalb dieses Blocks zu entsorgen. In diesem Fall ist das Objekt my_file
, das mit der Funktion open()
instanziiert wird. Das ersetzt mehrere Zeilen Boilerplate-Code, den es bräuchte, um die Datei zu öffnen, einzelne Zeilen auszulesen und sie dann zu schließen.
Die Konstruktion [x ... for x in my_file]
ist eine weitere Python-Eigenheit - die sogenannte List Comprehension ("Listenverständnis"). Sie ermöglicht es, ein Element, das andere Elemente enthält (in diesem Fall my_file und die darin enthaltenen Zeilen), zu iterieren und jedes iterierte Element automatisiert zu verarbeiten und automatisch an eine Liste anzuhängen.
Sie könnten also so etwas wie einen formalen for...
-Loop in Python coden - ähnlich wie in einer anderen Sprache. Python bietet allerdings die Möglichkeit, Dinge wie Loops, die über mehrere Objekte iterieren und eine einfache Operation an jedem Element in der Schleife durchführen, ökonomisch auszudrücken. Konstruktionen dieser Art befähigen Python-Developer, die Balance zwischen Kürze und Lesbarkeit zu wahren.
Die weiteren Funktionen von Python sind dazu gedacht, häufige Anwendungsfälle zu ergänzen. Die meisten modernen Objekttypen - etwa Unicode-Zeichenketten - sind direkt in Python integriert. Darüber hinaus auch Datenstrukturen wie Listen, Dictionaries (Hashmaps oder Key-Value-Stores), Tupel (um unveränderliche Objektsammlungen zu speichern) und Sets (um Sammlungen eindeutiger Objekte zu speichern).
Python 2 vs. Python 3
Python existiert in zwei verschiedenen Versionen, die viele neue Benutzer verwirren - nicht zuletzt deswegen, weil sie sehr viele Unterschiede aufweisen.
Der "Legacy"-Zweig der Sprache - Python 2.x - wurde bis zum Jahr 2020 unterstützt.
Python 3.x ist die aktuelle und künftige Inkarnation der Programmiersprache, die über zahlreiche nützliche und wichtige Funktionen verfügt, die in Python 2.x nicht enthalten sind - beispielsweise neue Syntaxfunktionen wie der "Walrus Operator", bessere Concurrency-Kontrollen und einen effizienteren Interpreter.
Die Verbreitung von Python 3 wurde über längeren Zeitraum durch einen Mangel an Drittanbieter-Bibliotheken gebremst. Erst mit der Ankündigung des End-of-Life-Datums für Python 2.x änderte sich das. Inzwischen sind die meisten Bibliotheken kompatibel mit Python 3.x. Für Legacy-Umgebungen, die auf Python 2.x angewiesen sind, sind jedoch verschiedene Strategien anwendbar.
Python-Tools und -Bibliotheken
Python ist unter Entwicklern auch wegen seines reichhaltigen und über Jahrzehnte gewachsenen Software-Ökosystems beliebt. Dabei profitiert die Programmiersprache einerseits von einer starken Standardbibliothek und andererseits auch von einer großzügigen Auswahl an Drittanbieter-Bibliotheken. Die Python-Standardbibliothek bietet Module für gängige Programmieraufgaben wie beispielsweise:
Mathematik,
String-Handling,
Datei- und Verzeichniszugriff,
Networking,
Asynchronous Operations,
Threading oder
Multiprocess-Management.
Sie enthält darüber hinaus aber auch Module, um allgemeine High-Level-Coding-Tasks zu managen, die für moderne Anwendungen erforderlich sind. Dazu gehört zum Beispiel:
strukturierte Dateiformate wie JSON und XML zu schreiben und zu lesen,
komprimierte Dateien zu bearbeiten oder
mit Internetprotokollen und Datenformaten (Webseiten, URLs, E-Mail) zu arbeiten.
Mit dem ctypes
-Modul von Python kann auf fast jeden externen Code, der eine C-kompatible Schnittstelle für Fremdfunktionen bereitstellt, zugegriffen werden. Die Standard-Python-Distribution bietet außerdem auch eine rudimentäre (aber nützliche), plattformübergreifende GUI-Bibliothek (Tkinter) und eine Embedded-Version der SQLite-3-Datenbank.
Über den Python Package Index (PyPI) stehen Tausende von Drittanbieter-Bibliotheken zur Verfügung. Einige der beliebtesten Beispiele sind:
BeautifulSoup ist eine All-in-One-Toolbox für HTML-Scraping und die zugehörige Datenextraktion.
Requests und httpx vereinfachen es, HTTP-Requests in großem Umfang zu händeln.
Web Frameworks ermöglichen es, Webservices für einfache und fortgeschrittene Anwendungsfälle schnell zu entwickeln.
NumPy, Pandas und Matplotlib beschleunigen mathematische und statistische Operationen und erleichtern es, Datenvisualisierungen zu erstellen.
Mit Apache Libcloud lassen sich mehrere Cloud-Dienste über das Objektmodell von Python managen.
This is a game changer and a new world order, particularly for data visualization. Matplotlib on excel ?????? @Microsoft Microsoft is bringing Python @ThePSF to Excel https://t.co/vPzVXnnjpC
— Mohamed Elshazly, MD (@mbelshazly) August 23, 2023
Python-Kompromisse
Wie C#, Java und Go setzt auch Python auf eine automatische Speicherverwaltung. Programmierer müssen also keinen Code implementieren, um Objekte zu tracken und freizugeben. Normalerweise läuft die Garbage Collection (für Objekte, die sich nicht selbst aufräumen) automatisch im Hintergrund. Falls das Performance-Probleme verursachen sollte, lässt sie sich auch manuell aktivieren oder vollständig deaktivieren. Sie haben dabei sogar die Möglichkeit, ganze Bereiche von Objekten von der Garbage Collection auszunehmen, um die Performance zu optimieren.
Pythons großzügige Verwendung von Leerzeichen ist eine seiner besten und gleichzeitig schlechtesten Eigenschaften: Die Einrückung in der zweiten Zeile im untenstehenden Beispiel dient nicht nur der Lesbarkeit - sie ist Bestandteil der Python-Syntax. Wird an dieser Stelle nicht korrekt gearbeitet, führt das zur Anlehnung von Programmen durch den Python-Interpreter.
with open('myfile.txt') as my_file:
file_lines = [x.rstrip('\n') for x in my_file]
Der syntaktische Leerraum schreckt einige Programmierer ab. Allerdings sind die strikten Einrückungs-Regeln in der Praxis weit weniger aufdringlich, als sie in der Theorie erscheinen. Das Ergebnis ist jedenfalls sauberer und besser lesbar.
Ein weiterer potenzieller Nachteil von Python (vor allem für diejenigen, die von Sprachen wie C oder Java kommen) ist die Art und Weise, wie die Sprache die Typisierung von Variablen handhabt. Standardmäßig verwendet Python dynamisches oder "Duck"-Typing. Das eignet sich sehr gut, um schnell zu programmieren, ist aber potenziell problematisch bei großen Codebasen.
All the python memes hit me like a rock ! pic.twitter.com/sUxtyCPoye
— Frigamribe88 (@Drawing23147245) August 26, 2023
Python und die Geschwindigkeit
Der häufigste Einwand, der gegen Python vorgebracht wird, ist seine Geschwindigkeit. Objektiv gesehen laufen Python-Programme allgemein deutlich langsamer als vergleichbare Anwendungen, die in C/C++ oder Java geschrieben sind.
Das liegt nicht nur daran, dass es sich bei den meisten Python-Laufzeiten um Interpreter und nicht um Compiler handelt. Es liegt auch daran, dass die inhärente Dynamik und die Formbarkeit von Objekten in Python es erschweren, die Sprache auf Geschwindigkeit zu optimieren - selbst, wenn sie kompiliert ist. Trotzdem hat Python ein weit weniger schwerwiegendes Geschwindigkeitsproblem, als es den Anschein hat - und es gibt Möglichkeiten, das Problem anzugehen.
Performance-Optimierungen für Python
Viele Python-Programme sind langsam, weil sie die Funktionen der Programmiersprache und ihre Standardbibliothek nicht richtig nutzen. Gerade Python-Einsteiger coden in Python oft so, wie sie es von C oder Java gewohnt sind - und übersehen deshalb mögliche Leistungsoptimierungen.
Ein gängiger Spruch in Developer-Kreisen lautet: 90 Prozent der Anwendungsaktivitäten finden in zehn Prozent des Codes statt. Diese zehn Prozent zu optimieren, kann folglich erhebliche Verbesserungen bringen. Im Fall von Python können Sie die zehn Prozent mit Hilfe von Projekten wie Cython oder Numba selektiv in C oder sogar Assembler-Sprache konvertieren. Im Ergebnis steht in vielen Fällen eine Anwendung, die in Sachen Speed auf Augenhöhe mit C läuft - dabei jedoch nicht mit Speicher-Mikromanagement überfrachtet ist.
Alternative Python-Laufzeiten bieten darüber hinaus auch Geschwindigkeitsoptimierungen, die der CPython Runtime nicht zur Verfügung stehen. Der Just-in-Time-Compiler PyPy wandelt Python zum Beispiel im Handumdrehen in nativen Maschinencode um und ermöglicht für viele gängige Operationen Geschwindigkeitszuwächse.
Kontinuierliche Python-Leistungssteigerungen
Die Kernentwickler der Standard-Python-Implementierung CPython haben im Laufe der Zeit verstärkt auf Performance-Verbesserungen hingearbeitet. So kann beispielsweise der von CPython aus dem Quellcode eines Programms generierte Bytecode zur Laufzeit analysiert und "spezialisiert" werden. Wenn ein bestimmter Prozess immer denselben Typ betrifft, kann dieser Vorgang für diesen Typ optimiert werden. Viele weitere Optimierungen dieser Art sind derzeit in Vorbereitung.
Ein größeres Projekt, das derzeit noch in den Kinderschuhen steckt, hat sich der Mission verschrieben, CPython von seinem Thread-Synchronisationsmechanismus namens Global Interpreter Lock (GIL) zu befreien. Eine neue Implementierung der Idee befindet sich aktuell in der Testphase und sieht vielversprechend aus. Sie soll sukzessive mit den nächsten Python-Versionen eingeführt werden.
Entwicklerzeit sticht Maschinenzeit
Bei vielen Aufgaben in Python übertrifft die Entwicklungs- die Ausführungsgeschwindigkeit. Letzteres kann im Fall von Python-Programmen sechs Sekunden dauern, während es im Fall anderer Sprachen nur den Bruchteil einer Sekunde dauert. Die Zeit, die bei der Ausführung des Python-Programms verloren geht, wird durch die Zeitersparnis beim Entwicklungsprozess allerdings mehr als wettgemacht.
Es sei denn, Sie schreiben Software, die einen hohen Durchsatz und eine hohe Gleichzeitigkeit erfordert - etwa eine Datenbank. Aber für die meisten reale Anwendungen ist Python in der Praxis schnell genug. Zudem können die Flexibilität und das Entwicklungstempo von Python Innovationen ermöglichen, die mit anderen Sprachen schwieriger und/oder zeitaufwändiger zu realisieren wären.
Dieser Beitrag basiert auf einem Artikel unserer US-Schwesterpublikation Infoworld.com.