Wenn Sie die Leistung des Zeilenlesens aus der Standardeingabe mit C und Python vergleichen, kann dies der Fall sein Seien Sie überrascht, dass C-Code tendenziell erheblich langsamer läuft als sein Python-Gegenstück. Dies kann auf grundlegende Unterschiede in den Standardeinstellungen für Eingabe/Ausgabe (I/O) in den beiden Sprachen zurückgeführt werden.
Standardmäßig der C-Eingabestream cin ist mit dem Standard-I/O-System (stdio) synchronisiert. Dies bedeutet, dass cin jegliche Eingabepufferung vermeidet und die Daten nach Bedarf Zeichen für Zeichen liest. Dieser Ansatz verhindert zwar potenzielle Probleme beim Mischen von C-I/O-Streams mit Standardfunktionen, führt jedoch zu Leistungseinbußen, insbesondere beim Lesen großer Datenmengen.
Im Gegensatz dazu Python verwendet standardmäßig gepufferte Eingaben. Beim Lesen aus der Standardeingabe in Python liest der Interpreter die Eingabe in größeren Blöcken, wodurch die Anzahl der erforderlichen Systemaufrufe reduziert wird. Pufferung verbessert die Leistung, indem sie den mit Systemaufrufen verbundenen Overhead minimiert und die Eingabeverarbeitung erheblich beschleunigen kann.
Um eine ähnliche Leistung wie Python in C zu erreichen, können Sie die Synchronisierung explizit deaktivieren zwischen cin und stdio mithilfe der Methode ios_base::sync_with_stdio(false). Dadurch kann cin Eingaben unabhängig puffern, was zu einer verbesserten Leistung führt.
Anstelle von getline(cin, input_line) sollten Sie die Verwendung von fgets(input_line, sizeof(input_line) in Betracht ziehen. , stdin) direkt. fgets ist eine C-Funktion, die eine Eingabezeile aus einem Stream liest und sie in einem Zeichenarray speichert. Durch die Vermeidung des Cin-Streams können Sie den Overhead weiter reduzieren und möglicherweise die Leistung verbessern.
Die bereitgestellte Tabelle fasst die Zeilenlesegeschwindigkeit verschiedener Ansätze in C und Python zusammen:
Implementation | Lines per Second |
---|---|
Python (default) | 3,571,428 |
cin (default/naive) | 819,672 |
cin (no sync) | 12,500,000 |
fgets | 14,285,714 |
wc (not fair comparison) | 54,644,808 |
Wie aus den Ergebnissen hervorgeht, ist die Standard-C-Implementierung deutlich langsamer als Python. Durch Deaktivieren der Stream-Synchronisierung oder direkte Verwendung von fgets können Sie jedoch eine vergleichbare oder bessere Leistung in C erzielen.
Das obige ist der detaillierte Inhalt vonWarum ist das Lesen von C-Zeilen langsamer als Python und wie kann es optimiert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!