Heute haben wir einen weiteren Versuch, das Unmögliche in eine Zeile zu quetschen, gefunden im Internet. Wenn Linters das sehen, fluchen sie nicht nur – sie deinstallieren sich selbst von Ihrem Gerät.
with open("t") as f:print(sum([sum([float(m) for m in "".join(filter(lambda x:x.isnumeric() or x.isspace() or x==".",l)).split()]) for l in f.readlines()]))🧐 Was passiert hier?
Der Autor dieses „Meisterwerks“ hat sich die Aufgabe gestellt: Alle Zahlen aus einer Textdatei extrahieren und summieren.
Warum verursacht das körperliche Schmerzen?
1️⃣ Speicher ist nicht unendlich.
f.readlines() lädt die gesamte Datei in den RAM. Wenn die Datei 10 GB groß ist, verabschiedet sich Ihr Server schneller, als Sie diesen Beitrag zu Ende lesen.2️⃣ Zeichenweise Filterung mit lambda. Einen String zeichenweise mit
"".join(filter(...)) zusammenzukleben ist die langsamste Methode zur String-Verarbeitung in Python. Programmieren wir hier oder fädeln wir Perlen auf?3️⃣ Verschachtelte Listen-Comprehensions. Lesbarkeit auf dem Niveau ägyptischer Hieroglyphen. Um zu verstehen, wo eine Klammer schließt, braucht man einen Exorzisten.
4️⃣ PEP8 hat den Chat verlassen. Fehlende Leerzeichen nach
: und um Operatoren herum ist keine Platzersparnis, sondern Respektlosigkeit gegenüber anderen.Fazit: Wir haben Code, der langsam läuft, Speicher frisst und völlig unlesbar ist.
✅ Wie macht man es menschenwürdig?
Wenn Sie Zahlen aus Text extrahieren müssen, gibt es dafür reguläre Ausdrücke.
So sollte dieser Code in einer gesunden Welt aussehen:
import re
def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Kontextmanager und Iterator über Zeilen verwenden
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Alles finden, was wie eine Zahl aussieht (ganze Zahl oder mit Punkt)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total
print(total_sum_from_file("t.txt"))Warum ist das besser:
1. Lesbarkeit: Selbst ein Junior versteht in 5 Sekunden, was hier passiert.
2. Speicher: Wir lesen die Datei zeilenweise. Wenn die Datei 10 GB wiegt, stürzt dieser Code nicht ab.
3. Geschwindigkeit:
re.findall auf C-Ebene ist schneller als Ihr zeichenweiser Filter in Python.#RaucherCode
Kommentare
0Noch keine Kommentare.