首頁 > 後端開發 > Python教學 > 為什麼 C 的 stdin 行讀取速度明顯慢於 Python,如何改進?

為什麼 C 的 stdin 行讀取速度明顯慢於 Python,如何改進?

DDD
發布: 2024-11-25 03:17:15
原創
605 人瀏覽過

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 並計算檔案中的行數。但是,它在內部循環中一次讀取文件的每個字元。這種方法效率低下,會導致過多的系統調用,從而導致執行緩慢。

C Streams 的預設設定

與 Python 不同,C Streams 的預設設定優先與 C 風格標準同步輸入和輸出功能。這種同步可確保 C 和 C 流一致地存取輸入和輸出資源。然而,這種同步也會阻止 C 流使用更有效率的緩衝機制。

cinstdio 同步,這會導致它避免任何輸入緩衝。因此,cin 一次只能讀取一個字符,使得過程更加耗時。

效能改進

為了提高 C 程式碼的效能,我們可以停用 cinstdio 之間的同步。透過在程式開頭加入語句 cin.sync_with_stdio(false),我們可以允許 C 流獨立緩衝其 I/O,從而顯著提高速度。

替代方案:使用 fgets

另一個提高效能的有效方法是使用 fgets() 而不是getline()fgets 是一個 C 函數,它從 stdin 讀取指定數量的字元到字元陣列中,從而更好地控制緩衝過程。

基準測試結果

示範效能差異,使用包含 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板