検索
ホームページバックエンド開発Python チュートリアルC の `stdin` 行の読み取りが Python よりも大幅に遅いのはなぜですか?それを改善するにはどうすればよいですか?

Why Is C  's `stdin` Line Reading Significantly Slower Than Python's, and How Can It Be Improved?

C では標準入力 (stdin) からの行の読み取りが Python よりも大幅に遅いのはなぜですか?

この記事では、標準入力 (stdin) から文字列データの行を読み取る理由を調査することを目的としています。 ) C を使用すると、一般に Python の対応物よりもはるかに遅くなります。まず、提供されたコードを調べて、潜在的な懸念領域を特定します。

C コード

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++;
}

このコードは、getline() を使用してテキスト行を読み取ります。 stdin を取得し、ファイル内の行数をカウントします。ただし、内部ループ内でファイルの各文字を一度に 1 つずつ読み取ります。このアプローチは非効率的であり、過剰なシステム コールが発生し、実行速度が遅くなります。

C ストリームのデフォルト設定

Python とは異なり、C ストリームには C スタイルの標準との同期を優先するデフォルト設定があります。入出力機能。この同期により、C ストリームと C ストリームの両方が入力リソースと出力リソースに一貫してアクセスできるようになります。ただし、この同期により、C ストリームがより効率的なバッファリング メカニズムを使用することもできなくなります。

cinstdio と同期されるため、入力バッファリングが回避されます。その結果、cin は一度に 1 文字だけを読み取るため、プロセスに時間がかかります。

パフォーマンスの向上

C コードのパフォーマンスを向上させるには、 cinstdio 間の同期を無効にすることができます。プログラムの先頭にステートメント cin.sync_with_stdio(false) を追加すると、C ストリームが I/O を個別にバッファリングできるようになり、速度が大幅に向上します。

代替案: fgets

の使用 パフォーマンスを向上させるもう 1 つの効果的なアプローチは、代わりに fgets() を使用することです。 getline() の。 fgets は、指定された数の文字を標準入力から文字配列に読み取り、バッファリング プロセスをより詳細に制御できる C 関数です。

ベンチマーク結果

パフォーマンスの違いを考慮して、1 億行を含むファイルがベンチマークに使用されました。元の (同期された) C コード、同期が無効になった C、および Python を使用した結果は次のとおりです。

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

C で同期を無効にすると大幅な改善が得られ、fgets を使用するとさらに優れたパフォーマンスが得られました。 wc の使用は、行数をカウントするために特別に設計されているため、公平な比較ではないことに注意することが重要です。

結論

C ストリームのデフォルト設定を理解し、実装することでストリーム同期の無効化や fgets の使用などの適切な最適化、行を読み取るための C コードのパフォーマンスstdin は劇的に改善され、対応する Python と同等か、それよりも高速になります。

以上がC の `stdin` 行の読み取りが Python よりも大幅に遅いのはなぜですか?それを改善するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Pythonリストに要素をどのように追加しますか?Pythonリストに要素をどのように追加しますか?May 04, 2025 am 12:17 AM

toAppendElementStoapyThonList、usetheappend()methodforsingleelements、extend()formultipleElements、andinsert()forspecificopsitions.1)useappend()foraddingoneElementatheend.2)useextend()toaddmultipleelementseffictience.3)

Pythonリストをどのように作成しますか?例を挙げてください。Pythonリストをどのように作成しますか?例を挙げてください。May 04, 2025 am 12:16 AM

To CreateapythonList、usesquareBrackets []およびSeparateItemswithcommas.1)listsaredynamicandcanholdmixdatatypes.2)useappend()、remaid()、andslicingformanipulation.3)listcompreheNsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsionsientionforcreating.4)

数値データの効率的なストレージと処理が重要な実際のユースケースについて話し合います。数値データの効率的なストレージと処理が重要な実際のユースケースについて話し合います。May 04, 2025 am 12:11 AM

金融、科学研究、医療、およびAIの分野では、数値データを効率的に保存および処理することが重要です。 1)財務では、メモリマッピングされたファイルとnumpyライブラリを使用すると、データ処理速度が大幅に向上する可能性があります。 2)科学研究の分野では、HDF5ファイルはデータストレージと取得用に最適化されています。 3)医療では、インデックス作成やパーティション化などのデータベース最適化テクノロジーがデータのパフォーマンスを向上させます。 4)AIでは、データシャーディングと分散トレーニングがモデルトレーニングを加速します。システムのパフォーマンスとスケーラビリティは、適切なツールとテクノロジーを選択し、ストレージと処理速度の間のトレードオフを検討することにより、大幅に改善できます。

Pythonアレイをどのように作成しますか?例を挙げてください。Pythonアレイをどのように作成しますか?例を挙げてください。May 04, 2025 am 12:10 AM

pythonarraysarasarecreatedusingthearraymodule、notbuilt-inlikelists.1)importthearraymodule.2)specifytheTypecode、emg。、 'i'forintegers.3)Arraysofferbettermemoreefficiency forhomogeneousdatabutlasefutablethanlists。

Shebangラインを使用してPythonインタープリターを指定するための選択肢は何ですか?Shebangラインを使用してPythonインタープリターを指定するための選択肢は何ですか?May 04, 2025 am 12:07 AM

Shebangラインに加えて、Pythonインタープリターを指定するには多くの方法があります。1。コマンドラインから直接Pythonコマンドを使用します。 2。バッチファイルまたはシェルスクリプトを使用します。 3. makeやcmakeなどのビルドツールを使用します。 4. Invokeなどのタスクランナーを使用します。各方法には利点と短所があり、プロジェクトのニーズに合った方法を選択することが重要です。

リストと配列の選択は、大規模なデータセットを扱うPythonアプリケーションの全体的なパフォーマンスにどのように影響しますか?リストと配列の選択は、大規模なデータセットを扱うPythonアプリケーションの全体的なパフォーマンスにどのように影響しますか?May 03, 2025 am 12:11 AM

forhandlinglaredataSetsinpython、usenumpyArrays forbetterperformance.1)numpyarraysarememory-effictientandfasterfornumericaloperations.2)nusinnnnedarytypeconversions.3)レバレッジベクトル化は、測定済みのマネージメーシェイメージーウェイズデイタイです

Pythonのリストと配列にメモリがどのように割り当てられるかを説明します。Pythonのリストと配列にメモリがどのように割り当てられるかを説明します。May 03, 2025 am 12:10 AM

inpython、listsusedynamicmemoryallocation with allocation、whilenumpyArraysalocatefixedmemory.1)listsallocatemorememorythanneededededinitivative.2)numpyArrayasallocateexactmemoryforements、rededicablebutlessflexibilityを提供します。

Pythonアレイ内の要素のデータ型をどのように指定しますか?Pythonアレイ内の要素のデータ型をどのように指定しますか?May 03, 2025 am 12:06 AM

inpython、youcanspecthedatatypeyfelemeremodelernspant.1)usenpynernrump.1)usenpynerp.dloatp.ploatm64、フォーマーpreciscontrolatatypes。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール