


Warum ist das Lesen von Zeilen aus stdin in C deutlich langsamer als in Python?
In diesem Artikel wollen wir untersuchen, warum das Lesen von Zeilen mit String-Daten aus der Standardeingabe (stdin ) mit C ist im Allgemeinen viel langsamer als sein Python-Gegenstück. Wir beginnen mit der Untersuchung des bereitgestellten Codes und identifizieren mögliche Problembereiche.
Der C-Code
string input_line; long line_count = 0; time_t start = time(NULL); int sec; int lps; while (cin) { getline(cin, input_line); if (!cin.eof()) line_count++; }
Dieser Code verwendet getline(), um Textzeilen zu lesen stdin und zählt die Anzahl der Zeilen in einer Datei. Es liest jedoch jedes Zeichen der Datei einzeln innerhalb einer inneren Schleife. Dieser Ansatz ist ineffizient und führt zu übermäßigen Systemaufrufen, was zu einer langsamen Ausführung führt.
Standardeinstellungen von C-Streams
Im Gegensatz zu Python verfügen C-Streams über Standardeinstellungen, die die Synchronisierung mit dem C-Stil-Standard priorisieren Eingabe- und Ausgabefunktionen. Durch diese Synchronisierung wird sichergestellt, dass sowohl C- als auch C-Streams konsistent auf Eingabe- und Ausgaberessourcen zugreifen. Diese Synchronisierung verhindert jedoch auch, dass C-Streams effizientere Puffermechanismen verwenden.
cin wird mit stdio synchronisiert, wodurch jegliche Eingabepufferung vermieden wird. Infolgedessen liest cin jeweils nur ein Zeichen, was den Vorgang zeitaufwändiger macht.
Leistungsverbesserungen
Um die Leistung des C-Codes zu verbessern, Wir können die Synchronisierung zwischen cin und stdio deaktivieren. Durch das Hinzufügen der Anweisung cin.sync_with_stdio(false) am Anfang des Programms können wir C-Streams ermöglichen, ihre E/A unabhängig zu puffern, was zu erheblichen Geschwindigkeitssteigerungen führt.
Alternative: Verwendung von fgets
Ein weiterer effektiver Ansatz zur Leistungssteigerung ist die Verwendung von fgets() anstelle von getline(). fgets ist eine C-Funktion, die eine bestimmte Anzahl von Zeichen aus stdin in ein Zeichenarray liest und so eine bessere Kontrolle über den Pufferungsprozess bietet.
Benchmark-Ergebnisse
Zur Demonstration der Aufgrund des Leistungsunterschieds wurde zum Benchmarking eine Datei mit 100 Millionen Zeilen verwendet. Die Ergebnisse unter Verwendung des ursprünglichen (synchronisierten) C-Codes, C mit deaktivierter Synchronisierung und Python waren wie folgt:
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 a fair comparison) | 54,644,808 |
Das Deaktivieren der Synchronisierung in C führte zu einer deutlichen Verbesserung, während die Verwendung von fgets eine noch bessere Leistung bot. Es ist wichtig zu beachten, dass die Verwendung von wc kein fairer Vergleich ist, da es speziell zum Zählen von Zeilen entwickelt wurde.
Schlussfolgerung
Durch Verständnis der Standardeinstellungen von C-Streams und Implementierung Durch entsprechende Optimierungen, wie das Deaktivieren der Stream-Synchronisierung oder die Verwendung von fgets, kann die Leistung von C-Code zum Lesen von Zeilen aus stdin erheblich verbessert werden, Damit ist es seinem Python-Gegenstück ebenbürtig oder sogar schneller.
Das obige ist der detaillierte Inhalt vonWarum ist das Lesen der „stdin'-Zeile von C deutlich langsamer als das von Python und wie kann es verbessert werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

ForHandlinglargedatasetsinpython, Usenumpyarraysforbetterperformance.1) Numpyarraysarememory-Effiction und FasterFornumericaloperations.2) meidenunnötiger Anbieter.3) HebelVectorisationFecedTimeComplexity.4) ManagemememoryusageSageWithEffizienceDeffictureWitheseffizienz

Inpython, listEUSUutsynamicMemoryAllocationWithover-Accocation, whilenumpyarraysalcodeFixedMemory.1) ListSallocatemoremoryThanneded intellig, vereitelte, dass die sterbliche Größe von Zeitpunkte, OfferingPredictableSageStoageStloseflexeflexibilität.

Inpython, youcansspecthedatatypeyFelemeremodelerernspant.1) Usenpynernrump.1) Usenpynerp.dloatp.Ploatm64, Formor -Präzise -Preciscontrolatatypen.

NumpyisessentialfornumericalComputingInpythonduetoitsSpeed, GedächtnisEffizienz und kompetentiertemaMatematical-Funktionen.1) ITSFACTBECAUSPERFORMATIONSOPERATIONS.2) NumpyarraysSaremoremory-Effecthonpythonlists.3) iTofferSAgyarraysAremoremory-Effizieren

ContInuuousMemoryAllocationScrucialforAraysBecauseAltoLowsFofficy und Fastelement Access.1) iTenablesconstantTimeAccess, O (1), Duetodirectaddresscalculation.2) itimProvesefficienceByallowing -MultipleTeLementFetchesperCacheline.3) Es wird gestellt

SlicingPapythonListisDoneUsingthesyntaxlist [Start: Stop: Stufe] .here'Showitworks: 1) StartIndexoFtheFirstelementtoinclude.2) stopiStheIndexoFtheFirstelementtoexclude.3) StepisTheincrementBetweenelesfulFulForForforexcractioningPorporionsporporionsPorporionsporporesporsporsporsporsporsporsporsporsporionsporsPorsPorsPorsPorsporsporsporsporsporsporsAntionsporsporesporesporesporsPorsPorsporsPorsPorsporsporspors,

Numpyallowsforvariousoperationssonarrays: 1) BasicarithmeticliKeaddition, Subtraktion, Multiplikation und Division; 2) AdvancedoperationssuchasmatrixMultiplication;

Arraysinpython, insbesondere ThroughNumpyandpandas, areessentialfordataanalyse, öfterspeedandeffizienz.1) numpyarraysenableAnalysHandlingoflargedatasets und CompompexoperationslikemovingAverages.2) Pandasextendsnumpy'ScapaBilitiesWithDaTataforsForstruc


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.

WebStorm-Mac-Version
Nützliche JavaScript-Entwicklungstools

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

SAP NetWeaver Server-Adapter für Eclipse
Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Dreamweaver Mac
Visuelle Webentwicklungstools
