Warum ist das Lesen von Zeilen aus stdin in C viel langsamer als in Python?
Problem:
Beim Vergleich von Python- und C-Code zum Lesen von String-Eingabezeilen aus stdin wird Python-Code deutlich schneller ausgeführt. Obwohl eine ordnungsgemäße C-Implementierung gewährleistet ist, übertrifft das Python-Äquivalent diese um eine Größenordnung.
Standardeinstellungen und Systemaufrufe:
In Python ist die Eingabepufferung standardmäßig aktiviert , was zu effizienten Lesevorgängen großer Blöcke und weniger Systemaufrufen führt. Im Gegensatz dazu werden C-Streams mit stdio synchronisiert, was cin dazu zwingt, die Eingabepufferung zu überspringen und Zeichen einzeln zu lesen. Diese Wahl, die Konflikte mit stdio-Funktionen verhindern soll, führt unbeabsichtigt zu einem erheblichen Overhead.
Leistungsoptimierung:
Um die C-Leistung zu verbessern, fügen Sie die Anweisung cin.sync_with_stdio(false) ein ) am Anfang von main. Dadurch wird die Stream-Synchronisierung deaktiviert und eine unabhängige Pufferung ermöglicht, was die Eingabelesegeschwindigkeit erheblich erhöht.
Alternative Optionen:
Eine weitere leistungsstarke Alternative zu cin ist fgets, das stdio-Funktionen verwendet zum direkten Lesen von Eingaben.
Vergleich Ergebnisse:
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 |
Das obige ist der detaillierte Inhalt vonWarum ist „cin' von C beim Lesen von Zeilen aus der Standardeingabe erheblich langsamer als „input()' von Python, und wie kann die Leistung verbessert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!