Warum ist das Lesen von C-Zeilen langsamer als Python und wie kann es optimiert werden?

Mary-Kate Olsen
Freigeben: 2024-11-23 19:14:12
Original
425 Leute haben es durchsucht

Why is C   Line Reading Slower Than Python, and How Can It Be Optimized?

Leistungsvergleich des Zeilenlesens in C und Python: Warum ist C langsamer?

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.

Die Eingabe-/Ausgabeeigenschaften von C verstehen

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.

Pythons Standard-Eingabepufferung

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.

Deaktivieren der C-Stream-Synchronisierung

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.

Zusätzliche Optimierung: Verwendung von fgets

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.

Vergleichsergebnisse

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage