Was ist Python?

13.01.2024 von Serdar Yegulalp
Python ist ein vielseitiges Powerhouse der modernen Softwareentwicklung. Das sollten Sie über die Programmiersprache wissen.
Python ist die treibende Kraft in diversen Bereichen der Softwareentwicklung - von Data Science und Machine Learning bis hin zu API Development.
Foto: Aastels - shutterstock.com

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:

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

Was Python nicht kann

Wer A sagt muss auch B sagen - für folgende Tasks ist Python weniger gut geeignet:

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.

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:

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:

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:

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.

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.